昨天我们用一个小栗子对struct
加深了印象,今天我们继续往下学。
Method Syntax
)这标题怪怪的。。。
方法methods
和函数functions
的用法一样,都是fn
关键字声明。
而他俩的不同点则是methods
需要被定义在struct、enum(枚举)、trait object
中。
methods
的第一个参数一定是self
,这个self
指向调用这个方法的struct
实例上下文,相当于js
中的this
。
还记得我们昨天写的栗子吗?我们最后声明了一个Rect
的struct
,将width
和height
关联到rect
矩形上,然后我们又写了一个rect
的方法用来计算面积area
。
但其实矩形的面积以及矩形的面积计算方法都是和矩形有关的,所以把矩形的面积以及计算面积的方法放到struct
上。
我们先来看下代码
可以看到,定义method
的关键字是impl
,不过不是写在method
前面的,而是给struct
的,毕竟这是一个struct
里的method
。
同时在调用方法时不用再传入参数width
和height
了,因为这俩属性是他自己的,可以再self(this)
上面直接拿到。
有一点你应该注意到了,那就是&self
,而不是self: &Rect
,这是一种语法糖写法。对于methods
来说定义self
类型是没必要的,它本身就被定义在struct
中,调用它的自然得是它的instance
,类型早就固定下来了。当然,你也可以写上。
area
属性我们是在获取area
方法返回的值之后再赋的值,这样可以,不过还有另外一种方式,可以将area
属性放到area
这个method
里面去赋值。
不过就代码可读性来说会差一些,毕竟赋值是在method
中。
另外还有个点说下,那就是属性和方法名是可以一样的,比如:
我们声明了一个width
的方法,返回是否有width
的判断结果。
rust
中用点表示法调用方法在C/C++
中,调用一个方法有两种方式:
->
来调用,比如:object_pointer -> get_data()
.类似(*object_pointer).get_data()
解引用。但是在rust
中就没这个必要, rust
会判断当前情况来自动加上&
引用或者解引用(dereference
)。 比如:
它俩是一样的。
如果还是不明白的话,我们来看下我们的例子
我们并没有用&rect.area()
,但实际上并没报错。
associated functions
)struct
这玩意儿长得像一个类,那么一个类怎么能少了构造函数呢?rust
中这种类似构造函数的东西叫做关联函数,它们同样定义在struct
中,但是它们的第一个参数并不是实例上下文self
,这也就说明struct
的实例并不能用点表示法调用这些方法。
另外它们的调用方法是用::
最常见的就是我们的String::from
和String::new
了,他们都会返回一个字符串实例。而这些字符串实例并不能再.new
这样调用。
我们来看个例子
Rect::create
就是一个典型的关联函数,它返回一个Rect
类型的实例, 可以看到create
方法它返回的是一个实例并且他的第一个参数并不是self
。
另外还可以这样写
最后说一下impl
允许同时存在多个,你可以把一整块impl
作用域拆分为好几块,这样可阅读性会更强(前提是代码量巨大)
今天我们学了如何定义一个method
以及定义associated functions
构造函数。
如果觉得对你有用的话,麻烦点个赞,谢谢~
发布于 2022-12-06 21:38・IP 属地广东