Rust中Optional<String>的最佳借用访问器模式?类型匹配问题咨询
问题:如何为Option实现返回Option<&str>的访问器?
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<&str>?还是Option<&String>才是正确模式,该风格指南已过时?
解决方案
- 只需在
as_ref()之后通过map方法对Option内部的&String做转换,即可得到Option<&str>,修正后的代码如下:
impl Person { fn first_name(&self) -> &str { self.first_name.as_str() } fn middle_name(&self) -> Option<&str> { self.middle_name.as_ref().map(|s| s.as_str()) } }
原因说明:
Option<String>调用as_ref()会生成Option<&String>,而map方法可以安全地对Option内部的有效值进行转换——这里通过as_str()把&String转为&str,最终得到符合返回类型要求的Option<&str>。风格指南并未过时,只是省略了
map这一常规转换步骤。Option<&str>依然是更优的选择:它比Option<&String>更通用,能兼容所有接受&str的API,符合Rust的惯用设计。
内容的提问来源于stack exchange,提问作者theory
相关产品推荐
相关产品推荐

