为什么从 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
函数中使用Something
的value
属性但是仅当两个函数 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]
}
另请参阅:
我有以下代码
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
函数中使用Something
的value
属性但是仅当两个函数 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]
}
另请参阅: