这个 rust-analyzer 风格指南推荐这样的访问器:
struct Person {
// Invariant: never empty
first_name: String,
middle_name: Option<String>
}
impl Person {
fn first_name(&self) -> &str { self.first_name.as_str() }
fn middle_name(&self) -> Option<&str> { self.middle_name.as_ref() }
}
但是,当我使用这种模式时,编译器会抱怨
middle_name()
的返回值:
mismatched types
expected enum `std::option::Option<&str>`
found enum `std::option::Option<&std::string::String>`
如果我将访问器的返回值更改为
Option<&String>
,它就可以工作。但在 Rust 中,人们通常不想使用 &str
而不是 &String
,就像 first_name()
那样吗?如何使用选项来做到这一点?或者 Option<&String>
实际上是正确的模式,而 风格指南 已经过时了?
Option::as_deref
从 Option<&str>
获取 Option<String>
。
impl Person {
fn first_name(&self) -> &str { self.first_name.as_str() }
fn middle_name(&self) -> Option<&str> { self.middle_name.as_deref() }
}