gpt4 book ai didi

mutex - 如何使方法不需要锁定互斥锁的可变自身?

转载 作者:行者123 更新时间:2023-11-29 07:57:06 24 4
gpt4 key购买 nike

访问结构的字段以进行读取 rust playpen :

use std::sync::Mutex;
#[deriving(Show)]
struct Test{
a: uint,
}
impl Test{
fn new() -> Test{
Test { a: 0}
}
fn get(&self) -> uint {
self.a
}
}
fn main() {
let t = Test{a: 42};
let m = Mutex::new(Test::new());
println!("Getting t: {} where t.a = {}", t.get(), t.a);
{
let m2 = m.lock();
println!("m2.a = {}", m2.a); // works
//println!("m2.get() = {}", m2.get()); // error: cannot borrow immutable local variable `m2` as mutable
}
}

所以在这种情况下,访问字段 m2.a 是可行的,但是调用 m2.get() 需要 m2 是可变的,尽管 get不改变任何东西,也没有声明要改变任何东西,尤其是 &self

为了使这段代码工作,我可以用 let mut m2 = m.lock(); 声明 m2 并且一切正常,但为什么我需要那个 mut在这里,有没有更好的方法来调用 m2.get() 而无需声明 m2 可变的方式与我对 t 的工作方式类似声明为非可变的并且仍然允许我调用 t.get()

最佳答案

是的,如果两者都可用,编译器倾向于调用 deref_mut 而不是 deref。在您的情况下,deref 就足够了并且可以工作,但是隐式取消引用机制选择了 deref_mut,然后提示 m2 不可变。

要补充一下 reem 所说的,锁对象确实同时实现了 DerefDerefMut,如果您不需要可变的借用,您可以通过显式重新借用不变的方式获得不可变的:

println!("m2.get() = {}", (&*m2).get());

如果您只需要这种访问权限,您还可以编写

let m2 = m.lock();
let m2 = &*m2;

然后允许

println!("m2.get() = {}", m2.get());

关于mutex - 如何使方法不需要锁定互斥锁的可变自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25775727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com