代码之家  ›  专栏  ›  技术社区  ›  LeMoussel

如何返回没有“无法移出借用内容”错误的值?[副本]

  •  2
  • LeMoussel  · 技术社区  · 8 年前

    我对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])

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

    如何返回值?有人能启发我吗?

    备注: 这不是重复的问题。我不要求任何人解释“索引内容”是什么意思,但如何在没有索引的情况下返回值 cannot move out of borrowed content 错误

    1 回复  |  直到 8 年前
        1
  •  3
  •   ljedrz    8 年前

    你需要 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())
        }
    }
    

    然而,对于内存密集型对象或其所有权因任何原因应被保留/保护的对象,我不建议这样做。