在rust中我们常见到self和Self,一个是小写另一个是大写,大写的常见于trait和impl中,而小写的则常见于方法的参数声明中,很多人把它俩容易弄混淆。搞不懂什么时候使用小写的,什么时候用大写的,今天这篇文章就带你搞定两者之间的区别。
Self
Self
是一个类型别名,通常用于trait
和impl
块中,表示当前的类型或类型的类型。- 在
Trait
定义中,Self
代表了实现该trait
的类型。 - 在
impl
中,Self可以用来引用当前实现类型的路径。
下面我们就举一个例子来具体说明Self的用法含义:
trait MyTrait {
fn method(&self) -> Self;
}
struct MyStruct;
impl MyTrait for MyStruct {
fn method(&self) -> Self {
MyStruct
}
}
在这个例子中,Self
在Trait MyTrait
表示实现了MyTrait
的类型,而在impl
块中,Self
指的是MyTrait
。
self
self
在rust中是一个关键字,用于引用当前对象的实例。- 在方法定义中,
self
是第一个参数,代表当前对象的引用。 self
可以是&self(借用当前实例),&mut self(可变借用当前实例),或者self
(获取当前实例的所有权)。
下面我们通过一个具体的例子来说明上述self的用法:
struct Point {
x: i32,
y: i32,
}
impl Point {
fn new(x: i32, y: i32) -> Self {
Point { x, y }
}
fn translate(&mut self, dx: i32, dy: i32) {
self.x += dx;
self.y += dy;
}
}
fn main() {
let mut point = Point::new(1, 1);
point.translate(2, 2);
println!("Point coordinates: ({}, {})", point.x, point.y);
}
在这个例子中:
- Point::new使用
Self
作为返回类型,表示返回一个新的Point实例。 - Point::translate方法实用&mut self作为第一个参数,表示该方法可变的借用Point实例,并具有修改该实例的能力,就是可以修改结构体Point中字段的值。
下面我们就二合的区别进行一个系统性的总结:
区别
Self
是一个类型,用于引用当前的类型,而self
是一个值,用于引用当前实例。Self
通常在trait
和impl
块中使用,而self
只能在方法定义中使用。Self
可以用于返回类型,类型参数等。而self
用于方法参数列表中,表示当前实例的引用。
至此已经详细的介绍了二者之间的用法和区别,在以后的开发或者阅读开源代码或者他人代码死的时候遇到二者就不再那么迷惑,如果本文对你有帮助,麻烦您转发点赞加关注,您的支持是我持续输出好文章的动力。您的一个点赞或者关注够我高兴一整天。
1
共 3 条评论, 1 页
评论区
写评论self是对象实例本身,不是引用,&self才是引用
👏👏👏
👏👏👏