rust - Option<&T> 如何实现复制

标签 rust borrow-checker ownership

我注意到 Option<&T> 和 Option 的映射函数有些奇怪, 经过快速谷歌搜索后,还有其他人注意到了同样的问题,如中所述 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是“选项<&T>实现复制”。

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

但是,我找不到任何显示“Option<&T> Implements 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),
}

看起来像是 Option 派生的 Copy 特征,所以第一个示例应该没问题。

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

最佳答案

使用#[derive(Copy)]包括 T: Copy约束。意思是Option<T>仅实现 Copy如果T实现Copy .

关于rust - Option<&T> 如何实现复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76643730/

相关文章:

rust - 在匹配语句中重用匹配变量

rust - 无法从匹配臂返回对成员的可变引用

rust - 根据索引替换数组元素

rust - 关联超特征类型的别名

rust - 在一个函数调用中无法两次借用自己

generics - 如何将外部关联类型强制为我的本地结构类型?

Rust - 创建 HashMap ,它使用它从迭代器存储的部分数据

函数参数的 C++ 所有权

rust - 获取向量中每个值的计数

rust - BTreeSet 包含值(使用自定义 Ord 实现)并错误地为 `contains` 返回 true