我注意到Option<;&;T&>和Option<;T&>;的 map 功能有些奇怪, 在快速搜索之后,另一个人注意到了相同的问题,如中所述 this question. 我将使用相同的例子.
let greet: Option<String> = Some("hi".to_string());
let mapped = greet.map(|e|e);
dbg!(mapped);
dbg!(greet);
错误消息为:
use of moved value: `greet` ....
另一方面,下面的代码是可以的.
let greet: Option<String> = Some("hi".to_string());
let mapped = greet.as_ref().map(|e|e);
dbg!(mapped);
dbg!(greet);
MAP函数的类型为:
pub const fn map<U, F>(self, f: F) -> Option<U>
因此,调用者的所有权应该转移到map中的"self",这question的解释是"Option<;&;T>;Implementes Copy".
因此,期权<;T&>转移所有权会导致错误,而期权<;&;T&>只是创建一个新副本.
但是,我找不到任何显示"Option<;&;T&>Implementes Copy"的地方, 更糟糕的是,从document:
/// 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),
}
这看起来像是选项<;T>;派生的复制特征,所以第一个示例应该可以.
我是否遗漏了模块级别文档中的任何内容?