我应该从getter返回&Option<Foo>还是Option<&Foo>?

8

我有一个结构体:

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

我想为它创建一个getter,这样用户就无法修改它但可以读取它:

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

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

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

2个回答

11

使用 Option<&T> 代替 &Option<T>。调用者关心被包装的值,而不是 Option

另外,实现类似这样的getter的常见方式如下:

impl Boo {
    pub fn get_foo(&self) -> Option<&Foo> { self.foo.as_ref() }
}

这样你就不需要在getter中检查包装值了。如果想返回可变值,请使用as_mut()


谢谢,我错过了那个。 - Tibor Benke

10
如果不确定,选择最灵活的解决方案。这样,您将在未来更改结构内部而不更改其 API 时具有最大的余地。
在这种情况下,这意味着选择 Option<&T>
- &Option<T> 强制您必须拥有对选项的引用, - Option<&T> 只需要对 T 的引用。
因此,例如,在后一种情况下,我可以存储一个 Vec<T>Result<T,Error>,仍然能够分发 Option<&T>。它更灵活。
注:这就是为什么接口通常使用 &str 而不是 &String&[T] 而不是 &Vec<T> 等等。更加灵活!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接