簡體   English   中英

為什么 clone() 不允許這樣做?

[英]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

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=8ab3c7355903fc34751d5bd5360bb71a

我正在執行.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM