我很好奇调用来自特征实现的函数的惯用方式是什么. 从技术上讲,它们可以作为显式引用传入的 struct 的函数调用,也可以作为 struct 的方法调用.我可以在Rust Book中看到前一个版本比后一个版本有一些偏好,但我个人觉得很奇怪,因为对于同一个对象,Rust Book使用方法语法来实现为 struct 实现的其他操作(不是来自特征实现的方法).

use std::rc::Rc;

fn main() {
    let rc = Rc::new(5);

    // Which call to clone is seen as idomatic?
    let c1 = Rc::clone(&rc);
    let c2 = rc.clone();

    println!("{} {} {}", *rc, *c1, *c2);
}

推荐答案

大多数特征方法应该使用点语法进行调用.

然而,对于Rc::clone()Arc::clone(),以及两者的Weak::clone(),一些人(包括我)更喜欢将它们与UFC(Rc::clone(&v)而不是v.clone())一起使用,以避免将它们与通常执行深度复制的大多数Clone实现混淆.正如@prog-fh所提到的,there is also a Clippy lint for that.

Rust相关问答推荐

PyReadonlyArray2到Vec T<>

使用元组执行条件分支的正确方法

Rust:跨多个线程使用hashmap Arc和rwlock

修改切片/引用数组

使用Box优化可选的已知长度数组的内存分配

S在Cargo.toml中添加工作空间开发依赖关系的正确方法是什么?

零拷贝按步骤引用一段字节

为相同特征的特征对象使用 move 方法实现特征

为什么特征默认没有调整大小?

确保参数是编译时定义的字符串文字

为什么 Rust 创建的 f32 小于 f32::MIN_POSITIVE?

如何强制匹配的返回类型为()?

如何在 Rust 中编写一个通用方法,它可以接受任何可以转换为另一个值的值?

如何在 Rust 中将函数项变成函数指针

返回优化后的标题:返回异步块的闭包的类型擦除

缺失serde的字段无法设置为默认值

如何递归传递闭包作为参数?

Some(v) 和 Some(&v) 有什么区别?

为什么 for_each 在释放模式(cargo run -r)下比 for 循环快得多?

将 (T, ()) 转换为 T 安全吗?