我定義了一個Attribute
類型,我有一個Vec<Attribute>
,我正在循環檢索「最好」的一個。這是類似於我第一次嘗試:Rust - 如何從for循環中檢索用戶定義的類型
let mut best_attr = &Attribute::new();
for a in attrs.iter() {
if is_best(a) { // simplified for example
best_attr = a;
}
}
root.attr = *best_attr; // root is a node in a tree structure
我有以下編譯錯誤:
-
:
- 將
#[deriving(Clone)]
屬性添加到我的Attribute
結構 - 用替換最後一個語句3210
.../src/main.rs:94:21: 94:31 error: cannot move out of dereference of `&`-pointer
.../src/main.rs:94 root.attr = *best_attr;
^~~~~~~~~~
一些尋找解決的辦法後,我做了以下解決錯誤
我不完全理解這是爲什麼會起作用,我覺得這是對我遇到的問題的粗略解決方案。這是如何解決錯誤的,這是解決這個問題的正確方法嗎?
不是Rust專家,但是IIRC,它是因爲'root'與'best_attr'有不同的作用域,''root'有時候可以回收'best_attr'的內存。所以這是不允許的。 clone()提供了一個範圍兼容的拷貝,所以它是允許的。 – WeaponsGrade
簡短回答:它歸結爲Rust的所有權模式。一次只能有一件事擁有一塊數據。 –
請注意,首先創建一個默認屬性是浪費的,您可以將'best_attr'設置爲'None',然後在您的循環中使用'best_attr = Some(a)'。當然,最後需要進行一些模式匹配。 –