Rust 中的方法调用有什么区别?

mas*_*cai 1 rust

我正在学习 Rust,想了解函数调用之间的区别

    S::foo(&s); 
    T::foo(&s);
    <S as T>::foo(&s);
Run Code Online (Sandbox Code Playgroud)

1 为什么我们需要这些方法?和区别?

2 我们应该在哪里使用它?

struct S;

trait T {
    fn foo(&self);
}

impl T for S {
    fn foo(&self) {
        println!("XXX");        
    }
}


fn main() {
    let s = S;
    s.foo(); // (It's clear)
    S::foo(&s); 
    T::foo(&s);
    <S as T>::foo(&s);
}
Run Code Online (Sandbox Code Playgroud)

caf*_*e25 5

s.foo()尽可能使用方法语法并且明确,它是最不冗长的,并且应用自动取消引用,以便您的代码会更干净。

S::foo(&s)当类型不明确时主要有用Self,它通常用于From::from避免在 ie 上出现涡轮鱼.into()或在 ie 的情况下Rc::clone避免混淆,如果它是引用计数器的廉价增加或内部值的更昂贵的克隆。

T::foo(&s)当固有实现foo和特征实现同时存在时是必要的:

// in addition to your definitions this exists
impl S {
    fn foo(&self) {
        println!("S")
    }
}
S::foo(&s); // -> prints S
T::foo(&s); // -> prints XXX
Run Code Online (Sandbox Code Playgroud)

<S as T>::foo(&s)当您组合最后两种情况时,您可以使用完全限定语法。