Web*_*rix 6 rust clippy clean-architecture
我正在检查代码中的Clippy调查结果,发现学究规则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);
}
}
Run Code Online (Sandbox Code Playgroud)
调用将arc_taker(arc.clone())增加引用计数,然后arc_taker再从减少计数返回。在这种情况下,这是没有用的,因为arc变量main已经Arc在整个调用过程中保持活动状态。引用它就足够了。无需增加参考计数。
在您的特定示例中,arc_taker甚至不必关心它是由进行管理的Arc。它关心的只是有一个Mutexto lock,因此要使您的功能不受限制,只需取一个&Mutex<MyStruct>。
如果您想Arc对它做任何特定的事情,例如获取weak_count或之类的东西,那么取一个&Arc<..>就很有意义。如果您的函数可以保留Arc的克隆,那么只有Arc按值取值才有意义,因为调用者可以决定通过调用.clone()(从而增加引用计数)或给您自己的所有权Arc(因此不会增加引用计数)。