2016-08-30 30 views
1

我是Rust的新手,並且玩弄了一下。這是我的第一個程序,看起來我已經遇到了可怕的借用檢查器。 :)如何在沒有「無法移出借用內容」錯誤的情況下返回值?

pub struct Foo<T> { 
    memory: Vec<T> 
} 

impl<T> Foo<T> { { 
    pub fn set(&mut self, value: T) { 
     self.memory.push(value); 
    } 

    pub fn get(&self, index: usize) -> Option<&T> { 
     Some(&self.memory[index]) 
    } 
} 

它編譯得很好,但我想從get函數返回值沒有引用。

如果我做

pub fn get(&self, index: usize) -> Option<T> { 
    Some(*&self.memory[index]) 
} 

哪些失敗:

error: cannot move out of borrowed content [E0507] Some(*&self.memory[index])

我只是不知道爲什麼借檢查的行爲這種方式。

我該如何返回值?任何人都可以啓發我嗎?

Rem:這不是重複的問題。我不會要求某人解釋「索引內容」是什麼意思,但如何在沒有cannot move out of borrowed content錯誤的情況下返回值。

回答

3

您需要clone您想返回的對象才能生效。這也意味着T需要是Clone才能。請看下面的代碼:

pub struct Foo<T: Clone> { 
    memory: Vec<T> 
} 

impl<T> Foo<T> where T:Clone { 
    pub fn set(&mut self, value: T) { 
     self.memory.push(value); 
    } 

    pub fn get(&self, index: usize) -> Option<T> { 
     Some(self.memory[index].clone()) 
    } 
} 

如果擔心,可以全額退還(不象一個向量的元素)的對象,你可以創建一個移動的物體,像這樣的方法:

pub struct Foo<T> { 
    memory: T 
} 

impl<T> Foo<T> { 
    pub fn get(self) -> Option<T> { 
     Some(self.memory) 
    } 
} 

請注意,這次參數不是&self,而只是self,所以所有權將被移動。

您也可以考慮爲T實施Copy。在這種情況下,它將被傳遞給作爲值而不是像基本類型的引用的函數,例如, i32

pub struct Foo<T: Copy> { 
    memory: Vec<T> 
} 

impl<T> Foo<T> where T:Copy { 
    pub fn set(&mut self, value: T) { 
     self.memory.push(value); 
    } 

    pub fn get(&self, index: usize) -> Option<T> { 
     Some(self.memory[index].clone()) 
    } 
} 

我不會這個電子書籍,但是,對於內存重物或那些所有權應該以任何理由被保存/保護。

+0

或者實現'Copy'。 – Shepmaster

+0

如何實現'T'的'Copy'? – LeMoussel

+0

我在帖子中添加了這些信息。 – ljedrz

相關問題