我有一个惰性静态结构,我希望能够在程序执行开始时将其设置为某个随机值,然后再获取。这个愚蠢的小片段可以用作示例:
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
静态的引用——与临时相反!我想这是RwLockReadGuard
第一次调用unwrap
返回的问题吗?
我可以通过更改返回类型来编译代码:
fn what_is_the_answer() -> RwLockReadGuard<'static, Option<Answer>> {
ANSWER
.read()
.unwrap()
}
但是现在调用代码变得非常不符合人体工程学 - 我必须进行两次额外调用才能获得实际值:
what_is_the_answer().as_ref().unwrap()
我可以以某种方式ANSWER
从该函数返回对静态的引用吗?我RwLockReadGuard<&Answer>
可以通过某种方式映射它来返回一个可能吗?