为什么从Rust中的函数返回&[u8]而不是u8会借用self?

时间:2018-08-09 23:55:27

标签: rust borrow-checker borrowing

我有以下代码

pub struct Something {
    value: usize,
}

impl Something {
    pub fn get_and_increment(&mut self) -> &[u8] {
        let res = self.get();
        self.value += 1;

        res
    }

    pub fn get(&self) -> &[u8] {
        &[3; 2]
    }
}

当我尝试编译它时,出现此错误:

error[E0506]: cannot assign to `self.value` because it is borrowed
 --> src/main.rs:8:9
  |
7 |         let res = self.get();
  |                   ---- borrow of `self.value` occurs here
8 |         self.value += 1;
  |         ^^^^^^^^^^^^^^^ assignment to borrowed `self.value` occurs here

如果我将每个函数的返回类型更改为u8而不是&[u8],则可以正常编译:

pub struct Something {
    value: usize,
}

impl Something {
    pub fn get_and_increment(&mut self) -> u8 {
        let res = self.get();
        self.value += 1;

        res
    }

    pub fn get(&self) -> u8 {
        3
    }
}

为什么在调用value之后,Rust不允许我在Something函数的get_and_increment中使用self.get的{​​{1}}属性,但是只有当两个函数都返回{ {1}}?

1 个答案:

答案 0 :(得分:1)

我强烈建议您返回并重新阅读The Rust Programming Language,尤其是有关references and borrowing的章节。

  

为什么从Rust中的函数返回&[u8]而不是u8借来自己?

您基本上是在询问

  

为什么为什么从功能“需要借用”中返回“借来的东西”而不是“不借来的东西”?

t悔的答案是:因为借用u8时没有借用&[u8]

  

为什么Rust不让我使用value属性

因为在检查self的主体时,编译器不知道get的值作为get_and_increment的一部分返回。您的get的实现完全有可能返回对value的引用,或者将来可能会返回,因此编译器必须采用保守的方法并禁止它。 / p>

  

但仅当两个函数都返回&[u8]时?

这是不正确的。 get_and_increment的返回类型对错误没有影响。 get的返回类型仅在包含引用的情况下起作用。


没有明显的理由让您返回引用,但是:

pub fn get(&self) -> [u8; 2] {
    [3; 2]
}

如果您出于某种原因要返回引用,则不必将其与self的生存期绑定(由于lifetime elision,您的代码会这样做):

pub fn get(&self) -> &'static [u8] {
    &[3; 2]
}

另请参阅: