Rust Self

作者: 空乱木 | 来源:发表于2019-11-01 09:58 被阅读0次

    原文链接:https://blog.csdn.net/KeenCryp/article/details/84800856

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

    • 1

    </pre>

    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

    相关文章

      网友评论

        本文标题:Rust Self

        本文链接:https://www.haomeiwen.com/subject/htqfbctx.html