Rust界的“双胞胎”:Self和self,你真的了解它们吗?别以为穿个马甲就不认识你了

科技   2024-11-08 15:14   加拿大  

在rust中我们常见到self和Self,一个是小写另一个是大写,大写的常见于trait和impl中,而小写的则常见于方法的参数声明中,很多人把它俩容易弄混淆。搞不懂什么时候使用小写的,什么时候用大写的,今天这篇文章就带你搞定两者之间的区别。

Self

  • Self是一个类型别名,通常用于traitimpl块中,表示当前的类型或类型的类型。
  • Trait定义中,Self代表了实现该trait的类型。
  • impl中,Self可以用来引用当前实现类型的路径。

下面我们就举一个例子来具体说明Self的用法含义:

trait MyTrait {
    fn method(&self) -> Self;
}

struct MyStruct;

impl MyTrait for MyStruct {
    fn method(&self) -> Self {
        MyStruct
    }
}

在这个例子中,SelfTrait 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(11);
    point.translate(22);
    println!("Point coordinates: ({}, {})", point.x, point.y);
}

在这个例子中:

  • Point::new使用Self作为返回类型,表示返回一个新的Point实例。
  • Point::translate方法实用&mut self作为第一个参数,表示该方法可变的借用Point实例,并具有修改该实例的能力,就是可以修改结构体Point中字段的值。

下面我们就二合的区别进行一个系统性的总结:

区别

  • Self是一个类型,用于引用当前的类型,而self是一个值,用于引用当前实例。
  • Self通常在traitimpl块中使用,而self只能在方法定义中使用。
  • Self可以用于返回类型,类型参数等。而self用于方法参数列表中,表示当前实例的引用。

至此已经详细的介绍了二者之间的用法和区别,在以后的开发或者阅读开源代码或者他人代码死的时候遇到二者就不再那么迷惑,如果本文对你有帮助,麻烦您转发点赞加关注,您的支持是我持续输出好文章的动力。您的一个点赞或者关注够我高兴一整天。

在rust中我们常见到self和Self,一个是小写另一个是大写,大写的常见于trait和impl中,而小写的则常见于方法的参数声明中,很多人把它俩容易弄混淆。搞不懂什么时候使用小写的,什么时候用大写的,今天这篇文章就带你搞定两者之间的区别。

Self

  • Self是一个类型别名,通常用于traitimpl块中,表示当前的类型或类型的类型。
  • Trait定义中,Self代表了实现该trait的类型。
  • impl中,Self可以用来引用当前实现类型的路径。

下面我们就举一个例子来具体说明Self的用法含义:

trait MyTrait {
    fn method(&self) -> Self;
}

struct MyStruct;

impl MyTrait for MyStruct {
    fn method(&self) -> Self {
        MyStruct
    }
}

在这个例子中,SelfTrait 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(11);
    point.translate(22);
    println!("Point coordinates: ({}, {})", point.x, point.y);
}

在这个例子中:

  • Point::new使用Self作为返回类型,表示返回一个新的Point实例。
  • Point::translate方法实用&mut self作为第一个参数,表示该方法可变的借用Point实例,并具有修改该实例的能力,就是可以修改结构体Point中字段的值。

下面我们就二合的区别进行一个系统性的总结:

区别

  • Self是一个类型,用于引用当前的类型,而self是一个值,用于引用当前实例。
  • Self通常在traitimpl块中使用,而self只能在方法定义中使用。
  • Self可以用于返回类型,类型参数等。而self用于方法参数列表中,表示当前实例的引用。

至此已经详细的介绍了二者之间的用法和区别,在以后的开发或者阅读开源代码或者他人代码死的时候遇到二者就不再那么迷惑,如果本文对你有帮助,麻烦您转发点赞加关注,您的支持是我持续输出好文章的动力。您的一个点赞或者关注够我高兴一整天。



Rust语言中文社区
Rust官方及社区最新信息搜集、文章推送,教程学习,技巧分享,社区交流。信息来源是整个全球Rust社区。
 最新文章