gpt4 book ai didi

rust - 如何使用对受 Arc> 保护的基础数据的引用?

转载 作者:行者123 更新时间:2023-11-29 08:26:54 26 4
gpt4 key购买 nike

<分区>

通过内部可变性模式获得的任何引用,可以是 Rc<RefCell<T>>Arc<RwLock<T>> , 必须在封闭函数返回时被删除。当您想使用此引用返回对某些数据的引用时 RefCellRwLock保护,这是不允许的。

我认为不允许它是正确的:因为我正在使用内部可变性,所以与“内部”相关的任何引用都应该委托(delegate)给运行时检查器,因此一个纯引用为 &T不应该暴露在外面。

但是,除了用 Rc<RefCell<T>> 包装底层数据外,我想不出一个好的替代方案来达到同样的目的。以及。

演示问题的代码:

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

struct MyStruct {
data: MyData,
}

struct MyData {
val: String,
}

fn main() {
let my_struct = MyStruct {
data: MyData {
val: String::from("hi"),
},
};
let obj = Arc::new(RwLock::new(my_struct));

let data = get_data_ref(&obj);
println!("{}", data);
}

fn get_data_ref(obj: &Arc<RwLock<MyStruct>>) -> &String {
let obj = Arc::clone(obj);

let data = obj.read().unwrap(); //data is created
data.get_data()
} //data dropped here, thus lives not long enough.

impl MyStruct {
fn get_data(&self) -> &String {
self.data.get_val()
}
}

impl MyData {
fn get_val(&self) -> &String {
&self.val
}
}

( playground )

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