【发布时间】:2020-11-28 19:10:30
【问题描述】:
我有一个惰性静态结构,我希望能够在程序执行开始时将其设置为某个随机值,然后再获取。可以拿这个小傻sn-p做例子:
use lazy_static::lazy_static;
use std::sync::RwLock;
struct Answer(i8);
lazy_static! {
static ref ANSWER: RwLock<Option<Answer>> = RwLock::new(None);
}
fn answer_question() {
*ANSWER.write().unwrap() = Some(Answer(42));
}
fn what_is_the_answer() -> &'static Answer {
ANSWER
.read()
.unwrap()
.as_ref()
.unwrap()
}
这段代码编译失败:
error[E0515]: cannot return value referencing temporary value
--> src/lib.rs:15:5
|
15 | ANSWER
| _____^
| |_____|
| ||
16 | || .read()
17 | || .unwrap()
| ||_________________- temporary value created here
18 | | .as_ref()
19 | | .unwrap()
| |__________________^ returns a value referencing data owned by the current function
我知道您不能返回对临时值的引用。但我想返回对ANSWER 的引用,它是静态的——与临时相反!我猜是第一次调用unwrap 返回的RwLockReadGuard 是问题所在?
我可以通过改变返回类型来编译代码:
fn what_is_the_answer() -> RwLockReadGuard<'static, Option<Answer>> {
ANSWER
.read()
.unwrap()
}
但是现在调用代码变得非常不符合人体工程学 - 我必须进行两次额外调用才能获得实际值:
what_is_the_answer().as_ref().unwrap()
我可以从这个函数中返回对静态ANSWER 的引用吗?我可以通过某种方式映射返回RwLockReadGuard<&Answer> 吗?
【问题讨论】:
-
正如您所猜想的那样,该示例将不起作用,因为返回的引用(来自选项)绑定到
LockGuard,该LockGuard在函数末尾被删除。借用检查器阻止对ANSWER的引用从锁中逃逸。你到底想在这里完成什么? -
@user2722968 我想在程序启动时设置一个全局变量(基于配置文件中的某些设置),并且我希望以后能够从程序中的各个位置以符合人体工程学的方式访问它。一切都发生在同一个线程中。
-
@user2722968 我进行了编辑以添加更多信息。
标签: rust readwritelock lazy-static