Self和self的区别

“所有的trait都定义了一个隐式的类型Self,它指当前实现此接口的类型。” ——Rust官方文档

self

self用作函数的第一个参数时,它等价于self: Self&self参数等价于self: &Self&mut self参数等价于self: &mut Self

Self

方法参数中的Self是一种语法糖,是方法的接收类型(例如,本方法所在的impl的类型)。

它可能出现在traitimpl中。但经常出现在trait中,它是任何最终实现trait的类型代替(在定义trait时未知该类型)。

trait Clone {
    fn clone(&self) -> Self;
}

我们有一个结构体类类型MyType,它实现了这个trait

impl Clone for MyType {
    //我可以使用具体类型(当前已知的,例如MyType)
    fn clone(&self) -> MyType;

    //或者再次使用Self,毕竟Self更简短
    fn clone(&self) -> Self
}

selftraitimpl中方法的第一个参数名。使用其他参数名是可能的,但有显著的差异:

  • 若使用self,函数被称为方法(method)
  • 若使用任何其他名字,函数被称为关联函数(associated function)

在Rust中,没有隐式传递this参数给某个类型的方法。你得显式将“当前对象”传递给方法参数。这将导致:

impl MyType {
    fn doit(this &MyType, a : u32) { ... }
}

正如我们所见,作为一种较短的写法,这也可能(仍然冗长):

impl MyType {
    fn doit(this &Self, a : u32) { ... }
}

因此,对照表:

Self  => self: Self
&self => self: &Self
&mut self => self: &mut Self

但调用这些函数的方式变了:

impl MyType{
    fn doit(&self, a: u32){
        //...
    }
    fn another(this: &Self, a: u32){
        //...
    }
}

fn main() {
    let m = Type;

    //都可以用作关联函数
    MyType::doit(&m, 1);
    MyType::another(&m, 2)

    //但只有”doit”可用作方法
    m.doit(3)    // m自动被借用
    m.another(4) //错误:没有命名为`another`的方法
}

参考样例

样例来自《深入浅出Rust》,我稍加扩展,作为演示功能用。

fn main() {
    let c = Circle {radius: 2f64};
    println!("The area is {}",c.area());

    println!("The area is {}",Circle::area2(&c))
}

trait Shape {
    fn area(self: &Self) -> f64;

    fn area2(this: &Self) -> f64;
}

struct Circle {
    radius: f64,
}

impl Shape for Circle {
    fn area(self: &Circle) -> f64 {
        std::f64::consts::PI*self.radius*self.radius
    }
    fn area2(this: &Circle) -> f64 {
        std::f64::consts::PI*this.radius*this.radius
    }
}

原文出处

https://stackoverflow.com/questions/32304595/whats-the-difference-between-self-and-self

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值