我有以下代码
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}}?
答案 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]
}
另请参阅: