如何在没有 '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 的对象,我不建议这样做。
我是 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 的对象,我不建议这样做。