面试题答案
一键面试1. 使用Once
类型在单线程环境下实现资源延迟初始化
在Rust中,std::sync::Once
类型用于在单线程环境下实现延迟初始化。Once
提供了call_once
方法,该方法会确保传递给它的闭包只被调用一次。
2. 具体代码示例
use std::sync::Once;
static INIT: Once = Once::new();
static mut RESOURCE: Option<String> = None;
fn get_resource() -> &'static str {
INIT.call_once(|| {
unsafe {
RESOURCE = Some("初始化资源".to_string());
}
});
unsafe {
RESOURCE.as_ref().unwrap().as_str()
}
}
在上述代码中:
- 首先定义了一个
INIT
的Once
静态实例。 - 同时定义了一个
RESOURCE
的静态可变变量,其初始值为None
,类型为Option<String>
。 get_resource
函数中,通过INIT.call_once
来确保闭包中的初始化代码只执行一次。闭包中对RESOURCE
进行初始化。- 最后通过
unsafe
块获取并返回RESOURCE
中的字符串。
3. Once
类型的关键方法及其作用
-
call_once<F: FnOnce()>(&self, f: F)
:- 作用:该方法接收一个闭包
f
,并确保这个闭包只被调用一次。如果call_once
被多次调用,只有第一次调用时会执行闭包f
,后续调用会直接返回,不会再次执行闭包。这使得Once
非常适合用于资源的延迟初始化,确保资源只被初始化一次。
- 作用:该方法接收一个闭包
-
call_once_force<F: FnOnce()>(&self, f: F)
(在Rust 1.63.0 及以上版本可用):- 作用:与
call_once
类似,也是确保闭包只被调用一次。不同之处在于,即使在闭包执行过程中发生了恐慌(panic),call_once_force
后续调用仍然不会再次执行闭包。而call_once
如果在闭包执行时发生恐慌,后续调用可能会再次执行闭包。
- 作用:与