如何传递对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发布于 2018-02-18 13:22:17
最简单的解决办法就是忽略克里皮。Clippy中的许多lints并不在基本编译器中,特别是因为它们可能是错误的或不适用的。除此之外,Arc已经是一种参考,而使用&Arc<_> (或&Rc<_>)很少有意义。
其次,正如red75prime所指出的,您可以将函数改为接受&A。
最后,如果你真的想安抚克里皮,你可以照它说的做:
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。
最后一个主要是为了完整。
发布于 2018-02-18 12:51:47
您可以将引用传递到Arc的内容。
fn ss(a: &A) {
a.send();
}
fn main() {
let a = Arc::new(B);
ss(&*a);
}https://stackoverflow.com/questions/48851650
复制相似问题