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

Why does returning a &[u8] rather than u8 from a function in Rust borrow self?

我有以下代码

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

如果我将每个函数的 return 类型更改为 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
    }
}

为什么Rust不让我在调用self.get后在get_and_increment函数中使用Somethingvalue属性但是仅当两个函数 return &[u8]?

我强烈建议返回并重新阅读 The Rust Programming Language, specifically the chapter about references and borrowing

Why does returning a &[u8] rather than u8 from a function in Rust borrow self?

本质上在问

why does returning «something that is borrowed» rather than «something that is not borrowed» from a function «require a borrow»?

痛悔的回答是:因为一个u8没有借,一个&[u8]借了

Why is it that Rust doesn't let me use the value property

因为编译器在检查 get_and_increment 的主体时不知道 self 的哪些值被 return 编辑为 get 的一部分。您的 get return 的实现完全有可能引用 value 或者将来可能 ,因此编译器必须采用保守路线并禁止它。

but only when both functions return &[u8]?

这不准确。 get_and_increment的return类型对报错没有影响。 get 的 return 类型仅重要在于它包含引用。


没有明显的理由让您return参考,但是:

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

如果您出于某种原因想要 return 引用,则不需要将其绑定到 self 的生命周期(由于 lifetime elision,您的代码会这样做) :

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

另请参阅: