如何传递具有特征的Arc作为参考?

Vic*_*voy 0 rust clippy

如何传递引用Arc<A>以便以下代码成功编译?

use std::sync::Arc;

trait A {
    fn send(&self);
}

struct B;
impl A for B {
    fn send(&self) {
        println!("SENT");
    }
}

fn ss(a: &Arc<A>) {
    let aa = a.clone();
    aa.send();
}

fn main() {
    let a = Arc::new(B);
    ss(&a);
}
Run Code Online (Sandbox Code Playgroud)

(游乐场)

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

没有引用代码上的Clippy错误:

  Compiling playground v0.0.1 (file:///playground)
warning: this argument is passed by value, but not consumed in the function body
  --> src/main.rs:13:10
   |
13 | fn ss(a: Arc<A>) {
   |          ^^^^^^ help: consider taking a reference instead: `&Arc<A>`
   |
   = note: #[warn(needless_pass_by_value)] on by default
   = help: for further information visit https://rust-lang-nursery.github.io/rust-clippy/v0.0.186/index.html#needless_pass_by_value
Run Code Online (Sandbox Code Playgroud)

red*_*ime 6

您可以改为传递对Arc的内容的引用。

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

fn main() {
    let a = Arc::new(B);
    ss(&*a);
}
Run Code Online (Sandbox Code Playgroud)


DK.*_*DK. 5

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

其次,正如red75prime所说,你可以改变&A代替的功能.

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

fn main() {
    let a = Arc::new(B);
    { let a: Arc<A> = a.clone(); ss(&a); }
}
Run Code Online (Sandbox Code Playgroud)

你必须这样做的原因是你只能强迫间接的"最外层"层.该let强制转换所Arc<B>Arc<A>,然后创建一个指向它.

如果有某些原因ss 需要它的参数Arc(例如克隆它),只需忽略Clippy或禁用该lint.如果有任何理由ss 需要它的参数是一个Arc(你只需要里面有什么的话),改ss&A来代替.

最后一个主要是为了完整性.