为什么 Option<String>.as_ref() 不会解引用到 Option<&str>?

use*_*682 6 string optional rust

我希望这两个代码示例的结果相同:

let maybe_string = Some(String::from("foo"));
let string = if let Some(ref value) = maybe_string { value } else { "none" };
Run Code Online (Sandbox Code Playgroud)
let maybe_string = Some(String::from("foo"));
let string = maybe_string.as_ref().unwrap_or("none");
Run Code Online (Sandbox Code Playgroud)

第二个示例给了我一个错误:

let maybe_string = Some(String::from("foo"));
let string = if let Some(ref value) = maybe_string { value } else { "none" };
Run Code Online (Sandbox Code Playgroud)

She*_*ter 7

因为这是如何Option::as_ref定义的:

impl<T> Option<T> {
    fn as_ref(&self) -> Option<&T>
}
Run Code Online (Sandbox Code Playgroud)

既然你有Option<String>,那么结果类型必须Option<&String>

相反,您可以添加String::as_str

maybe_string.as_ref().map(String::as_str).unwrap_or("none");
Run Code Online (Sandbox Code Playgroud)

或者更短的:

maybe_string.as_ref().map_or("none", String::as_str);
Run Code Online (Sandbox Code Playgroud)

从 Rust 1.40 开始,您还可以使用Option::as_deref.

maybe_string.as_deref().unwrap_or("none");
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • 关于从`Option&lt;String&gt;` 到`Option&lt;&amp;str&gt;` 的相关讨论正在[提议的RFC](https://github.com/rust-lang/rfcs/pull/1792) 中进行。 (2认同)