这可能不可能是第一次有人问这个问题,但我一生都找不到这个答案。所以我想问这个问题,希望有人会严厉惩罚我并告诉我实际去哪里,或者很多人会发现这也很有用:)
在代码示例中,我会这样说:
let a = Arc::new(37);
let a_clone = Arc::clone();
if a_clone.read().unwrap() == 37 { // this is the code I am not sure about
println!("Hooray!");
} else {
println!("when the heckity did that change")
}
另外,在阅读之前我是否总是需要克隆?可能不会,对吧?我也不介意对
Arc
进行进一步的解释,这样我就可以了解实际发生的情况,而无需在 IDE 中进行混搭:)
如果您有
Arc
那么您已经有了很强的参考,因此无需克隆。仅当您想要将相同值的句柄提供给其他事物(通常是需要访问相同值的另一个线程或异步任务)时,才需要克隆。 (如果不需要写入该值(在这种情况下,您还需要内部可变性)并且可以廉价复制,那么您根本不需要 Arc
。)
Arc<T>
自动取消引用为 T
,因此在上面的代码中您可以只说 if *a == 37
,例如。 因为它会自动取消引用,所以您还可以直接在 T
上调用所包含的 Arc
上的方法(只要 Arc
没有同名的方法,这也是 的许多成员的原因) Arc
是关联函数而不是方法)。