rust - 为什么 Clippy 建议传递 Arc 作为引用?

标签 rust clean-architecture rust-clippy

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

它说:

warning: this argument is passed by value, but not consumed in the function body

help: consider taking a reference instead: &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

最佳答案

调用 arc_taker(arc.clone())增加引用计数,并从 arc_taker 返回再次递减它。在这种情况下这是无用的,因为 arc main 的变量已经保留了 Arc整个通话过程中都活着。对它的引用就足够了。无需上下颠簸引用计数。

在您的具体示例中,arc_taker甚至不关心它是由 Arc 管理的.它只关心有一个 Mutexlock ,所以为了让你的功能限制更少,只需要一个 &Mutex<MyStruct>相反。

如果你想做任何Arc -特定的东西,比如得到 weak_count或其他东西,采取 &Arc<..>会有意义。如果您的函数会保留 Arc 的克隆,那么只有采用 Arc 才有意义。按值,因为调用者可以决定通过调用 .clone() 给你一个额外的引用(从而增加引用计数),或者给你自己的所有权 Arc (因此不会影响引用计数)。

关于rust - 为什么 Clippy 建议传递 Arc 作为引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55576425/

相关文章:

rust - "fn main() -> ! {...}"时无法运行功能模块

rust - 读取两个阻塞迭代器

rust - 在 Rust 中为 Option<number> 做 max 的惯用方法

macros - 如何编写有条件地更新模拟器 CPU 标志的宏?

android - 如何获取领域层的字符串资源

rust - clippy::missing_const_for_fn在构造函数和获取方法上触发。那是真的吗?

rust - 运行 Clippy 时排除依赖项

android - 整洁架构与 MVPC/MVC/MVP

ios - 当框架有外部依赖时,如何将 iOS 框架作为 git 子模块导入