Rust 将弧转换为多弧(&M)

Rust 将弧转换为多弧(&M),rust,Rust,我试图在一个特征中找到一个可以通过引用而变异的值。问题是字符串值非常大,可能会被许多线程访问,因此我的解决方案如下所示: trait MyTrait { fn name<'a>(&'a mut self) -> &'a mut String; } struct SimpleImpl { name: String } impl MyTrait for SimpleImpl { fn name<'a>(&'a mut

我试图在一个特征中找到一个可以通过引用而变异的值。问题是字符串值非常大,可能会被许多线程访问,因此我的解决方案如下所示:

trait MyTrait {
    fn name<'a>(&'a mut self) -> &'a mut String;
}

struct SimpleImpl {
    name: String
}

impl MyTrait for SimpleImpl {
    fn name<'a>(&'a mut self) -> &'a mut String {
        &mut self.name
    }
}

use std::sync::{Arc,RwLock};

struct ParallelImpl {
    name: Arc<RwLock<String>>
}

impl MyTrait for ParallelImpl {
    fn name<'a>(&'a mut self) -> &'a mut String {
        self.name.get_mut().unwrap()
    }
}

fn main() {
    let mut a = SimpleImpl { name: String::from("simple") };
    let mut b = ParallelImpl { name: Arc::new(RwLock::new(String::from("parallel"))) };

    a.name().as_mut_str();
    b.name().as_mut_str();
}

为什么我不能调用get_mut来同时展开圆弧和RwLock?

更好地查看RwLock的界面

返回作为保护对象的LockResult。此防护装置的破坏会自动解锁锁

为了安全起见,通过调用防护上的“展开”得到的&mut T是从防护借用的,也就是说,展开结果的生命周期受防护的生命周期限制,因为防护被破坏后,锁被解锁

在这里,您正在创建一个临时保护并立即将其丢弃,因此引用的生存期不能超过函数的生存期


恭喜生锈!还有一个在编译时被阻止的数据竞争:

请仔细查看RwLock的接口

返回作为保护对象的LockResult。此防护装置的破坏会自动解锁锁

为了安全起见,通过调用防护上的“展开”得到的&mut T是从防护借用的,也就是说,展开结果的生命周期受防护的生命周期限制,因为防护被破坏后,锁被解锁

在这里,您正在创建一个临时保护并立即将其丢弃,因此引用的生存期不能超过函数的生存期


恭喜生锈!还有一种数据竞争在编译时被阻止了:

所以我必须从name返回一个LockResult?@johnmcrae另一种可能是设计API。这将允许在并行和非并行情况下使用相同的接口。@JohnMcCrae:嗯,它有点复杂。在Rust实现了将关联类型参数化为生存期的能力之前,不幸的是,不可能从trait的不同实现中返回不同的类型…因此我必须从name返回LockResult?@johnmcrae另一个方法是设计API。这将允许在并行和非并行情况下使用相同的接口。@JohnMcCrae:嗯,它有点复杂。除非Rust实现了将关联类型参数化为生存期的功能,否则不幸的是,不可能从特性的不同实现中返回不同的类型…这看起来像是板条箱的另一项工作。它包括一个类型,它的行为很像一个引用,但保持着防护装置。这看起来像是板条箱的另一项工作。它包括一个类型,该类型的行为非常类似于引用,但保持了防护。