Option<&T> 如何实现复制

The*_*ora 2 ownership rust borrow-checker

我注意到 Option<&T> 和 Option<T> 的映射函数有些奇怪,经过快速谷歌搜索后,还有其他人注意到了同样的问题,如 这个问题中所述。我将仅使用相同的示例。

let greet: Option<String> = Some("hi".to_string());

let mapped = greet.map(|e|e);

dbg!(mapped);
dbg!(greet);
Run Code Online (Sandbox Code Playgroud)

错误消息是:

use of moved value: `greet` ....
Run Code Online (Sandbox Code Playgroud)

另一方面,下面的代码是可以的。

let greet: Option<String> = Some("hi".to_string());

let mapped = greet.as_ref().map(|e|e);

dbg!(mapped);
dbg!(greet);
Run Code Online (Sandbox Code Playgroud)

地图函数的类型是:

pub const fn map<U, F>(self, f: F) -> Option<U>
Run Code Online (Sandbox Code Playgroud)

因此,调用者的所有权应该转移到映射中的“self”,该问题的解释是“Option<&T>implements Copy”。

因此,Option<T> 转移所有权从而导致错误,而 Option<&T> 只是创建一个新副本。

但是,我找不到任何显示“Option<&T> Implements Copy”的地方,更糟糕的是,来自文档

/// The `Option` type. See [the module level documentation](self) for more.
#[derive(Copy, PartialOrd, Eq, Ord, Debug, Hash)]
#[rustc_diagnostic_item = "Option"]
#[cfg_attr(not(bootstrap), lang = "Option")]
#[stable(feature = "rust1", since = "1.0.0")]
pub enum Option<T> {
    /// No value.
    #[lang = "None"]
    #[stable(feature = "rust1", since = "1.0.0")]
    None,
    /// Some value of type `T`.
    #[lang = "Some"]
    #[stable(feature = "rust1", since = "1.0.0")]
    Some(#[stable(feature = "rust1", since = "1.0.0")] T),
}
Run Code Online (Sandbox Code Playgroud)

看起来像 Option<T> 派生的 Copy 特征,所以第一个例子应该没​​问题。

我错过了模块级文档中的任何内容吗?

kmd*_*eko 5

使用#[derive(Copy)]包含T: Copy约束。意思是Option<T>只有实现了CopyT实现Copy