如何让unwrap_or返回零向量?Rust中Option<Vec>引用返回实现
解决Rust中返回临时向量引用的编译错误
错误原因
你遇到的E0515错误,本质是返回了指向临时值的引用:unwrap_or_else闭包里创建的vec![0, 10]是函数内的临时对象,当bar函数执行完毕后,这个临时向量会被销毁,返回的引用就变成了悬空引用——Rust的所有权机制会直接阻止这种不安全行为。
正确实现方案
方案一:使用静态常量存储默认向量
如果默认向量是固定不变的,将其定义为结构体的静态常量是最简洁高效的方式,静态常量的生命周期为'static,和结构体引用的生命周期完全兼容:
pub struct Foo { pub data: Option<Vec<u32>> } impl Foo { // 定义静态默认向量,程序启动时分配内存,生命周期贯穿整个程序 const DEFAULT_VEC: Vec<u32> = vec![0, 10]; fn bar(&self) -> &Vec<u32> { self.data.as_ref().unwrap_or(&Self::DEFAULT_VEC) } } fn main() { let foo = Foo { data: None }; println!("{:?}", foo.bar()); // 输出 [0, 10] let foo2 = Foo { data: Some(vec![5, 6]) }; println!("{:?}", foo2.bar()); // 输出 [5, 6] }
方案二:将默认向量存储在结构体中
如果默认向量需要随实例动态调整(比如不同Foo实例的默认值不同),可以把默认向量作为结构体的字段持有,返回的引用会绑定到结构体自身的生命周期:
pub struct Foo { pub data: Option<Vec<u32>>, default_data: Vec<u32>, } impl Foo { // 构造函数初始化默认向量 fn new(data: Option<Vec<u32>>) -> Self { Foo { data, default_data: vec![0, 10], } } fn bar(&self) -> &Vec<u32> { self.data.as_ref().unwrap_or(&self.default_data) } } fn main() { let foo = Foo::new(None); println!("{:?}", foo.bar()); // 输出 [0, 10] let foo2 = Foo::new(Some(vec![5, 6])); println!("{:?}", foo2.bar()); // 输出 [5, 6] }
内容的提问来源于stack exchange,提问作者Poma
相关产品推荐
相关产品推荐

