为什么Clippy建议通过弧线作为参考?

时间:2019-04-08 15:04:33

标签: rust clean-architecture clippy

我正在检查代码中的Clippy发现,发现the pedantic rule needless_pass_by_value可能是误报。

它说:

  

警告:此参数按值传递,但不会在函数体内使用

     

帮助:考虑改用参考文献:&Arc<Mutex<MyStruct>>

由于克隆Arc仅是引用计数,因此移动Arc并不是一个坏主意。在质量和性能方面,发送参考而不是Arc的值真的有什么区别吗?

#![warn(clippy::pedantic)]

use std::sync::{Arc, Mutex};

fn main() {
    let my_struct = MyStruct { value: 3 };
    let arc = Arc::new(Mutex::new(my_struct));

    arc_taker(arc.clone());
}

fn arc_taker(prm: Arc<Mutex<MyStruct>>) {
    prm.lock().unwrap().do_something();
}

struct MyStruct {
    value: i32,
}

impl MyStruct {
    fn do_something(&self) {
        println!("self.value: {}", self.value);
    }
}

Playground

1 个答案:

答案 0 :(得分:7)

调用arc_taker(arc.clone())将增加引用计数,而从arc_taker返回将再次减少引用计数。在这种情况下,这是没有用的,因为arc的{​​{1}}变量在整个调用过程中已经使main保持活动状态。引用它就足够了。无需增加引用计数。

在您的特定示例中,Arc甚至都不关心它是由arc_taker管理的。它只关心ArcMutex之间的距离,因此,为了减少对函数的限制,只需改用lock

如果您想对它进行任何&Mutex<MyStruct>特定的操作,例如获取Arc之类的东西,那么服用weak_count就很有意义。如果您的函数保留了Arc的克隆,那么只有按值取&Arc<..>才有意义,因为调用者可以决定通过调用Arc来给您附加引用(因此会增加参考计数),或者为您提供自己的.clone()的所有权(因此不会增加参考计数)。