我注意到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&lt;&amp;T&gt;Implementes Copy".

因此,期权&lt;T&>转移所有权会导致错误,而期权&lt;&amp;T&>只是创建一个新副本.

但是,我找不到任何显示"Option&lt;&amp;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),
}

这看起来像是选项&lt;T&gt;派生的复制特征,所以第一个示例应该可以.

我是否遗漏了模块级别文档中的任何内容?

推荐答案

使用#[derive(Copy)]包括T: Copy约束.这意味着如果T实现Copy,则Option<T>仅实现Copy.

Rust相关问答推荐

为什么我们不能通过指针算法将Rust原始指针指向任意地址?'

为什么拥有的trait对象的相等运算符移动了正确的操作数?

在执行其他工作的同时,从共享裁判后面的VEC中删除重复项

在不重写/专门化整个函数的情况下添加单个匹配手臂到特征的方法?

铁 rust 中的泛型:不能将`<;T作为添加>;::Output`除以`{Float}`

一种随机局部搜索算法的基准(分数)

如果包名称与bin名称相同,并且main.ars位于工作区的同一 crate 中,则无法添加对lib.ars的依赖

为什么TcpListener的文件描述符和生成的TcpStream不同?

为什么Rust不支持带关联常量的特征对象?

为什么`str`类型可以是任意大小(未知大小),而`string`类型的大小应该是已知的?

正在将带有盒的异步特征迁移到新的异步_fn_in_特征功能

处理带有panic 的 Err 时,匹配臂具有不兼容的类型

我可以解构self 参数吗?

从 rust 函数返回 &HashMap

为什么是&mut发送?线程如何在安全的 Rust 中捕获 &mut?

错误:将自定义 proc_macro 与用Rust 的宝贝编写的属性一起使用时,无法在此范围内找到属性

在 Rust 中,我如何处理请求 javascript 的页面?

如何存储返回 Future 的闭包列表并在 Rust 中的线程之间共享它?

基于名称是否存在的条件编译

为什么当borrow 变量发生变化时,borrow 变量不会改变?