这两种为 Rust 频道克隆发件人的方法有什么区别?

Jus*_*ner 1 clone channel duplicates rust

在 Rust 官方书籍 16-11 中,它通过

let (tx, rx) = mpsc::channel();
let tx1 = mpsc::Sender::clone(&tx);
Run Code Online (Sandbox Code Playgroud)

但我试过了

let (tx, rx) = mpsc::channel();
let tx1 = tx.clone();
Run Code Online (Sandbox Code Playgroud)

这也有效。它们之间有什么区别?如果它们本质上是相同的,那么考虑到我们已经有了通用clone()方法,为什么还要创建一个单独的方法呢?

Ibr*_*med 5

for 的函数签名clone如下所示。请注意,它需要&self作为参数:

fn clone(&self) -> Sender<T>;
Run Code Online (Sandbox Code Playgroud)

您可以通过显式传递来调用该函数&self

mpsc::Sender::clone(&tx);
Run Code Online (Sandbox Code Playgroud)

或者通过使用方法调用表达式

tx.clone();
Run Code Online (Sandbox Code Playgroud)

方法调用表达式只是语法糖,尽管编译器确实必须执行更复杂的查找过程才能为self.

请注意,这适用于采用以下任何其他关联方法self

pub struct Bar {}

impl Bar {
    fn bla(&self) {}
}

fn main() {
    let bar = Bar {};
    
    // these are equivalent
    bar.bla();
    Bar::bla(&bar)
}
Run Code Online (Sandbox Code Playgroud)