我是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:这不是重复的问题。我不会问某人解释什么&#34;索引的内容&#34;意味着如何在没有cannot move out of borrowed content
错误的情况下返回值。
答案 0 :(得分: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
,因此将移动所有权。
您还可以考虑为Copy
实施T
。在这种情况下,它将作为值而不是像基本类型的引用传递给函数,例如, 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())
}
}
但是,对于内存繁重的对象或者由于任何原因应该保留/保护所有权的对象,我不会建议这样做。