[英]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.