Rust 如何通过以特征为参照的圆弧?

Rust 如何通过以特征为参照的圆弧?,rust,clippy,Rust,Clippy,如何传递对Arc)的引用 如果我省略了引用,它可以编译,但Clippy警告我,在这种情况下,没有任何意义 上的Clippy错误: 编译操场v0.0.1(file:///playground) 警告:此参数通过值传递,但不会在函数体中使用 -->src/main.rs:13:10 | 13 | fn不锈钢(a:Arc){ 帮助:考虑引用一个参考词:“和ARC” | =注意:#[警告(无需按值传递)]默认打开 =帮助:有关更多信息,请访问https://rust-lang-nursery.githu

如何传递对
Arc)的引用

如果我省略了引用,它可以编译,但Clippy警告我,在这种情况下,没有任何意义

上的Clippy错误:

编译操场v0.0.1(file:///playground)
警告:此参数通过值传递,但不会在函数体中使用
-->src/main.rs:13:10
|
13 | fn不锈钢(a:Arc){
帮助:考虑引用一个参考词:“和ARC”
|
=注意:#[警告(无需按值传递)]默认打开
=帮助:有关更多信息,请访问https://rust-lang-nursery.github.io/rust-clippy/v0.0.186/index.html#needless_pass_by_value

您可以将引用传递给
Arc
的内容

fn ss(a: &A) {
    a.send();
}

fn main() {
    let a = Arc::new(B);
    ss(&*a);
}

嗯,最简单的解决方法就是忽略Clippy。Clippy中的许多lint不在基本编译器中,因为它们可能是错误的或不适用的。此外,
Arc
已经是一种参考,使用
&Arc
(或
&Rc
)很少有意义

其次,正如red75prime所指出的,您可以将函数改为采用
&A

最后,如果你真的想安抚Clippy,你可以照上面说的做:

fn main() {
    let a = Arc::new(B);
    { let a: Arc<A> = a.clone(); ss(&a); }
}
fn main(){
设a=Arc::new(B);
{设a:Arc=a.clone();ss(&a);}
}
必须这样做的原因是,您只能强制“最外层”的间接寻址。let
强制为
,然后创建指向它的指针

如果有某种原因
ss
需要它的参数是
Arc
(例如克隆它),只需忽略Clippy或禁用该lint。如果没有原因
ss
需要它的参数是
Arc
(您只需要它里面的内容),则将
ss
改为使用
&A


最后一段主要是为了完整性。

我想在最后一段的旁边加上一句——如果
ss
总是需要克隆
Arc
,它可能只需要按值获取
Arc
,让调用者决定是否需要克隆。
fn main() {
    let a = Arc::new(B);
    { let a: Arc<A> = a.clone(); ss(&a); }
}