为什么Clippy建议传递Arc作为参考?

问题描述 投票:6回答:1

我正在检查我的代码中的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

rust clean-architecture clippy
1个回答
7
投票

调用arc_taker(arc.clone())会增加引用计数,并且从arc_taker返回会再次减少它。在这种情况下,这是无用的,因为arcmain变量已经在整个呼叫期间保持Arc活着。对它的引用已经足够了。无需上下颠倒引用计数。

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

如果你想做任何Arc特定的事情,比如获得weak_count或其他什么,拿一个&Arc<..>会有意义。如果你的函数会保留Arc的克隆,那么只有这样才能通过值获取Arc,因为然后调用者可以通过调用.clone()来决定给你一个额外的引用(从而撞击引用计数),或者给你自己的Arc所有权(因此不会碰到引用计数)。

© www.soinside.com 2019 - 2024. All rights reserved.