-1

我有以下代码

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

为什么 Rust 不允许我在调用后使用函数中的value属性,但只有在两个函数都返回时才使用?Somethingget_and_incrementself.get&[u8]

4

1 回答 1

1

我强烈建议回去重新阅读Rust 编程语言,特别是关于引用和借用的章节。

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

本质上是在问

为什么从函数“需要借用”返回“借来的东西”而不是“没有借来的东西”?

悔恨的答案是:因为 au8不是借来的,而 a&[u8]是借来的。

为什么 Rust 不允许我使用该value属性

self因为编译器不知道get在检查get_and_increment. 您的实现完全有可能get返回对 的引用value或者将来可能会返回,因此编译器必须采取保守的路线并禁止它。

但只有当两个函数都返回时&[u8]

这是不准确的。的返回类型get_and_increment对错误没有影响。的返回类型get仅在它包含引用时很重要。


但是,您没有明显的理由返回参考:

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

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

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

也可以看看:

于 2018-08-10T00:46:47.960 回答