我应该返回&amp; Option <foo>或Option&lt;&amp; Foo&gt;来自吸气剂?

时间:2017-07-21 12:26:40

标签: rust

我有一个结构:

struct Foo {}
struct Boo {
    foo: Option<Foo>,
}

我想为它创建getter,因此用户无法修改它,但可以阅读它:

impl Boo {
    pub fn get_foo(&self) -> ? { unimplemented!(); }
}

我应该退回&Option<Foo>还是Option<&Foo>?这两种变体之间有什么优势吗?

我在我的程序中使用这两种变体,混合它们变得很不方便,所以我想为整个程序选择其中一种。

2 个答案:

答案 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>,...更灵活!