impl
此章(Rust面向对象的所有篇目)假设你已经接触学习过面向对象(C++最好)。
如果你正在别的语言中学习面向对象思想,建议你先从中学习后再看此章节下的所有篇章。
使用impl
(implementations
:实现)将函数关联到同作用域内的结构体和枚举上
面向对象有一个重要的思想:将方法(函数)绑定(关联)到类(结构体)上。
而impl
就是用于将函数绑定到结构体的Rust关键字,下面是一个例子:
1 | // 客户信息 |
运行结果:
1 | id: 0 |
impl
也可以用于枚举上:
1 | enum Num { |
在impl
中定义的函数被称为关联函数,也被称为方法。
另外提醒一点,impl
块内也不能声明同名函数。
Self
和self
Self
关键字表示所impl
结构体的类型,例如:
1 | struct Test1; |
self
关键字用于表明该函数是实例函数,使用了self
作为参数名的关联函数就能通过实例调用的方式调用,例如:
1 | struct Test { |
看到self
,有人可能会想到C++的this
指针。但是与C++不同的是,要想使用self
,必须在函数参数首部添加self
参数。
回顾一下,函数及其返回值中提到:
1
2 // 注意参数二前面加了`mut`,此时便可获取arg_name2的修 w改权
fn function_name(/* arg_name1: type, mut arg_name2: type */) -> return_type {
self
传参时,参数是不可变的。类似的,可以在self
前加上mut
以获取self
的修改权。
1 | impl Test { |
让我们尝试使用test()
:
1 | fn main() { |
cargo run
,哦豁,编译报错:
1 | 13 | t.test(); |
好了,看到这里你也许以为我会说明原因,但并不是,因为原因脱离了本篇的主题。之所以提供上述错误示例,是想提醒一下不要因为遇到上述问题而困惑并停滞学习,我将会在所有权系统一篇解释相关原因,让我们跳过这个问题,继续学习。