簡體   English   中英

如何通過帶有特征的弧作為參考?

[英]How to pass a Arc with a trait as a reference?

如何傳遞對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);
}

游樂場

如果我省略該引用,它可以編譯,但是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

好吧,最簡單的解決方法就是忽略Clippy Clippy中的許多棉絨都不在基本編譯器中,因為它們可能是錯誤的或不適用的。 除此之外, Arc已經是一種引用,采用&Arc<_> (或&Rc<_> )很少有意義。

其次,正如red75prime指出的那樣,您可以將函數更改為&A

最后,如果您真的想安撫Clippy,則可以按照它說的做:

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

您必須采用這種方式的原因是,您只能強迫間接的“最外層”。 let脅迫的Arc<B>Arc<A> ,然后創建一個指向它的指針。

如果出於某些原因, ss 需要將其參數設置為Arc (例如克隆),只需忽略Clippy或禁用該功能即可。 如果沒有理由ss 需要其參數為Arc (您只需要其中的內容),則將ss更改為&A

最后一個主要是為了完整性。

您可以改為傳遞對Arc內容的引用。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM