读取 Arc 内的值的规范方法是什么?

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

这可能不可能是第一次有人问这个问题,但我一生都找不到这个答案。所以我想问这个问题,希望有人会严厉惩罚我并告诉我实际去哪里,或者很多人会发现这也很有用:)

在代码示例中,我会这样说:

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 中进行混搭:)

rust reference-counting
1个回答
0
投票

如果您有

Arc
那么您已经有了很强的参考,因此无需克隆。仅当您想要将相同值的句柄提供给其他事物(通常是需要访问相同值的另一个线程或异步任务)时,才需要克隆。 (如果不需要写入该值(在这种情况下,您还需要内部可变性)并且可以廉价复制,那么您根本不需要
Arc
。)

Arc<T>
自动取消引用为
T
,因此在上面的代码中您可以只说
if *a == 37
,例如。 因为它会自动取消引用,所以您还可以直接在
T
上调用所包含的
Arc
上的方法(只要
Arc
没有同名的方法,这也是
 的许多成员的原因) Arc
是关联函数而不是方法)。

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