将 Option<&T> 转换为 Option<T>

Fab*_*aru 5 generics rust

我有一个为 int 做的函数:

fn some_to_value(src: Option<&int>) -> Option<int> {
    match src {
        Some(x) => Some(*x),
        None => None
    }
}
Run Code Online (Sandbox Code Playgroud)

我想让它通用(并且仍然在调用者级别使用“int”)。如果复制 T 的实例对我来说就可以了。所以我尝试这样做:

fn some_to_value<T>(src: Option<&T>) -> Option<T> {
    match src {
        Some(x) => Some(*x),
        None => None
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到:

error: cannot move out of dereference of `&`-pointer
Some(x) => Some(*x),
                ^~
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它会失败(我是初学者)。

一些上下文:我制作了一个 Option 的副本,因为我意识到在对“HashMap”进行“查找”之后,只要返回“查找”(一个包含对地图的项目)是活着的。

huo*_*uon 4

Rust 语言有很强的所有权概念,这导致了这种“移动与复制”的场景(我将在这个答案中使用术语)。

共享引用(通常)是内存中某处&T的只读视图。T一个重要的属性是不允许您使其无效T: a&T 必须始终指向有效的T实例。

当您编写时,*x您尝试T按值移出,因为T是无界泛型,编译器必须假设最坏的情况:类型T不是Copy,因此必须移动所有权,即按值使用(又名字节复制) ) 不是语义副本,这意味着无法继续使用源(有关此问题的更多说明,请参阅我的链接答案)。移动所有权会使源无效...但源位于 a 内部&T,因此使其无效是非法的!

*x之所以有效,int是因为它是Copy,因此按值使用(也称为字节复制)与语义复制相同: 不会&int失效。