如何在没有 'cannot move out of borrowed content' 错误的情况下 return 值?

How to return value with no 'cannot move out of borrowed content' error?

我是 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])
    }
}

它编译得很好,但我想 return 值不是来自 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])

我只是不知道借用检查器为什么会这样。

我怎样才能return值?谁能赐教一下?

Rem: 这不是重复的问题。我不要求别人解释 "indexed content" 是什么意思,而是如何在没有 cannot move out of borrowed content 错误的情况下 return 值。

您需要 clone 您想要 return 的对象才能实现。这也意味着 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())
    }
}

如果这涉及一个可以 return 完整编辑的对象(与向量的元素不同),您可以创建一个移动对象的方法,如下所示:

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

但是,对于内存密集型对象或出于任何原因其所有权应为 preserved/secured 的对象,我不建议这样做。