[英]Why doesn't clone() allow for this move?
我不明白為什么以下不起作用:
use std::collections::HashMap;
#[derive(Debug,Clone,PartialEq)]
struct Foo<'a> {
contents: HashMap<&'a str, Foo<'a>>,
}
fn bar<'a>(val: Foo<'a>) -> Foo<'a> {
*val.contents.get("bar").clone().unwrap()
}
error[E0507]: cannot move out of a shared reference
--> src/lib.rs:9:5
|
9 | *val.contents.get("bar").clone().unwrap()
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ move occurs because value has type `Foo<'_>`, which does not implement the `Copy` trait
我正在執行.clone()
,我認為這應該允許我返回結果值,其所有權應與輸入值分離,但情況似乎並非如此。
另一個奇怪的事情,它本身不是一個阻止程序,但可能暗示了潛在的問題,是由於某種原因.clone()
返回一個&Foo
,這很令人驚訝,因為在其他情況下我.clone()
看到.clone()
從&T -> T
。 這就是*
存在的原因; 沒有它,這不會通過類型檢查。 我知道 Rust 有一些“神奇”的引用/取消引用規則,但我無法弄清楚這一點。
HashMap.get
返回一個Option<&T>
。 克隆這個選項會給你另一個Option<&T>
,引用同一個對象。
如果要將Option<&T>
轉換為新的Option<T>
,其中T
支持Clone
,則可以使用.cloned()
。 也沒有必要再取消引用,因為您有一個T
而不是&T
。
這意味着您的代碼將如下所示:
use std::collections::HashMap;
#[derive(Debug, Clone, PartialEq)]
struct Foo<'a> {
contents: HashMap<&'a str, Foo<'a>>,
}
fn bar<'a>(val: Foo<'a>) -> Foo<'a> {
val.contents.get("bar").cloned().unwrap()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.