首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过带有特征的弧形作为参考?

如何通过带有特征的弧形作为参考?
EN

Stack Overflow用户
提问于 2018-02-18 12:26:16
回答 2查看 2.6K关注 0票数 1

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

代码语言:javascript
复制
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错误

代码语言:javascript
复制
  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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-18 13:22:17

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

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

最后,如果你真的想安抚克里皮,你可以照它说的做:

代码语言:javascript
复制
fn main() {
    let a = Arc::new(B);
    { let a: Arc<A> = a.clone(); ss(&a); }
}

你必须这样做的原因是,你只能强迫“最外层”的间接层。letArc<B>强制放入Arc<A>,然后创建指向它的指针。

如果有某种原因,ss需要它的参数作为一个Arc (如克隆它),只需忽略Clippy或禁用该林子即可。如果ss没有理由需要它的参数成为一个Arc (您只需要它里面的内容),那么将ss改为&A

最后一个主要是为了完整。

票数 5
EN

Stack Overflow用户

发布于 2018-02-18 12:51:47

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

代码语言:javascript
复制
fn ss(a: &A) {
    a.send();
}

fn main() {
    let a = Arc::new(B);
    ss(&*a);
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48851650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档