Rust Arc/Mutex 尝试宏借用的内容
Rust Arc/Mutex Try Macro Borrowed Content
我正在尝试对封装在 Arc<Mutex>
中的跨线程共享的变量执行多项操作。由于并非所有操作都可能成功,我正在尝试使用 try!
宏或 ?
运算符来自动传播错误。
这是我的代码的最小可行示例:
lazy_static! {
static ref BIG_NUMBER: Arc<Mutex<Option<u32>>> = Arc::new(Mutex::new(Some(174)));
}
pub fn unpack_big_number() -> Result<u32, Box<Error>> {
let big_number_arc = Arc::clone(&BIG_NUMBER);
let mutex_guard_result = big_number_arc.lock();
let guarded_big_number_option = mutex_guard_result?;
let dereferenced_big_number_option = *guarded_big_number_option;
let big_number = dereferenced_big_number_option.unwrap();
// do some subsequent operations
let result = big_number + 5;
// happy path
Ok(result)
}
您会注意到,在我声明 guarded_big_number_option
的行的末尾有一个 ?
。该行抛出以下编译器错误(当我将 ?
替换为 .unwrap()
:
时它不会
error[E0597]: `big_number_arc` does not live long enough
--> src/main.rs:32:30
|
7 | let mutex_guard_result = big_number_arc.lock();
| ^^^^^^^^^^^^^^ borrowed value does not live long enough
...
17 | }
| - borrowed value only lives until here
|
= note: borrowed value must be valid for the static lifetime...
现在的问题是,我的理解是我不会尝试在 big_number_arc
的生命周期之后继续使用它。我正在尝试提取结果中包含的潜在 PoisonError
。我怎样才能正确提取该错误并使该传播起作用?
此外,如果有任何帮助,下面是我的 IDE、CLion 自动添加到每一行的类型注释的屏幕截图:
lock()
函数 returns LockResult<MutexGuard<T>>
。 Documentation 表示如下:
Note that the Err variant also carries the associated guard, and it can be acquired through the into_inner method
所以你实际上是在尝试 return 对局部变量的引用(包装到 PoisonError
结构中),这显然是不正确的。
如何解决?您可以将此错误转换为没有此类引用的内容,例如 String
:
let guarded_big_number_option = mutex_guard_result.map_err(|e| e.to_string())?;
我正在尝试对封装在 Arc<Mutex>
中的跨线程共享的变量执行多项操作。由于并非所有操作都可能成功,我正在尝试使用 try!
宏或 ?
运算符来自动传播错误。
这是我的代码的最小可行示例:
lazy_static! {
static ref BIG_NUMBER: Arc<Mutex<Option<u32>>> = Arc::new(Mutex::new(Some(174)));
}
pub fn unpack_big_number() -> Result<u32, Box<Error>> {
let big_number_arc = Arc::clone(&BIG_NUMBER);
let mutex_guard_result = big_number_arc.lock();
let guarded_big_number_option = mutex_guard_result?;
let dereferenced_big_number_option = *guarded_big_number_option;
let big_number = dereferenced_big_number_option.unwrap();
// do some subsequent operations
let result = big_number + 5;
// happy path
Ok(result)
}
您会注意到,在我声明 guarded_big_number_option
的行的末尾有一个 ?
。该行抛出以下编译器错误(当我将 ?
替换为 .unwrap()
:
error[E0597]: `big_number_arc` does not live long enough
--> src/main.rs:32:30
|
7 | let mutex_guard_result = big_number_arc.lock();
| ^^^^^^^^^^^^^^ borrowed value does not live long enough
...
17 | }
| - borrowed value only lives until here
|
= note: borrowed value must be valid for the static lifetime...
现在的问题是,我的理解是我不会尝试在 big_number_arc
的生命周期之后继续使用它。我正在尝试提取结果中包含的潜在 PoisonError
。我怎样才能正确提取该错误并使该传播起作用?
此外,如果有任何帮助,下面是我的 IDE、CLion 自动添加到每一行的类型注释的屏幕截图:
lock()
函数 returns LockResult<MutexGuard<T>>
。 Documentation 表示如下:
Note that the Err variant also carries the associated guard, and it can be acquired through the into_inner method
所以你实际上是在尝试 return 对局部变量的引用(包装到 PoisonError
结构中),这显然是不正确的。
如何解决?您可以将此错误转换为没有此类引用的内容,例如 String
:
let guarded_big_number_option = mutex_guard_result.map_err(|e| e.to_string())?;