没有'如何返回价值,无法摆脱借来的内容'错误?

时间:2016-08-30 13:50:06

标签: rust borrow-checker

我是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错误的情况下返回值。

1 个答案:

答案 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())
    }
}

但是,对于内存繁重的对象或者由于任何原因应该保留/保护所有权的对象,我不会建议这样做。