我有一个结构:
struct Foo {}
struct Boo {
foo: Option<Foo>,
}
我想为它创建getter,因此用户无法修改它,但可以阅读它:
impl Boo {
pub fn get_foo(&self) -> ? { unimplemented!(); }
}
我应该退回&Option<Foo>
还是Option<&Foo>
?这两种变体之间有什么优势吗?
我在我的程序中使用这两种变体,混合它们变得很不方便,所以我想为整个程序选择其中一种。
答案 0 :(得分:8)
使用Option<&T>
代替&Option<T>
。来电者对包裹的价值感兴趣,而不是Option
。
此外,实现这样的getter的常用方法如下:
impl Boo {
pub fn get_foo(&self) -> Option<&Foo> { self.foo.as_ref() }
}
这样您就不需要检查getter中的包装值。如果要返回可变值,请改用as_mut()
。
答案 1 :(得分:7)
如有疑问,请选择最灵活的解决方案。这使您在未来改变结构的内部结构时可以获得最大的余地。
在这种情况下,这意味着选择Option<&T>
:
&Option<T>
强制您引用选项,Option<&T>
只需要引用T
。因此,例如,在后一种情况下,我可以存储Vec<T>
或Result<T, Error>
,但仍然可以分发Option<&T>
。它更灵活。
注意:这就是为什么界面通常使用&str
代替&String
,&[T]
代替&Vec<T>
,...更灵活!