내 코드에서 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);
}
}
호출 arc_taker(arc.clone())
하면 참조 횟수가 증가하고에서 반환 arc_taker
하면 다시 감소합니다. 이 경우에는의 arc
변수가 전체 호출 중에 main
이미 활성 상태를 유지 하므로 쓸모가 없습니다 Arc
. 그것에 대한 참조는 이미 충분합니다. 참조 카운트를 높이거나 낮출 필요가 없습니다.
특정 예에서, arc_taker
심지어는에 의해 관리되는 것을 상관하지 않는다 Arc
. 그것이 신경 쓰이는 것은 Mutex
to 가 있다는 것입니다. lock
따라서 함수를 덜 제한적으로 만들려면 &Mutex<MyStruct>
대신 a를 사용하십시오.
또는 무언가를 Arc
얻는 것과 같은 특정 작업 을 수행 하려면 weak_count
a를 취하는 &Arc<..>
것이 합리적입니다. 함수는 주변의 아크의 복제를 계속 할 경우에만 다음은 걸릴 나을 Arc
다음 호출자가 호출하여 당신에게 그것에 추가 참조를 제공하기로 결정 할 수 있기 때문에, 값 .clone()
(즉 참조 카운트를 해주), 또는에 자체 소유권을 제공 Arc
하므로 참조 횟수가 증가하지 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다