Rust 为什么返回a&;[u8]而不是来自函数的u8?
我有以下代码Rust 为什么返回a&;[u8]而不是来自函数的u8?,rust,borrow-checker,borrowing,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] {
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]
}
}
当我尝试编译此文件时,会出现以下错误:
错误[E0506]:无法分配给'self.value',因为它是借用的
-->src/main.rs:8:9
|
7 |让res=self.get();
|---“self.value”的借词出现在这里
8 |自我价值+=1;
|^^^^^^^^^^^^^^^^^^^^^^此处发生借来的'self.value'赋值
如果我将每个函数的返回类型更改为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\u and\u increment
函数中使用值属性Something
为什么从Rust中的函数返回&[u8]而不是u8
你本质上是在问
为什么从函数“借用”返回“借用的东西”而不是“未借用的东西”需要借用
懊悔的回答是:因为u8
没有被借用,而和[u8]
被借用
为什么Rust不允许我使用值
属性
因为编译器不知道在检查get\u和\u increment
的主体时,self
的哪些值作为get
的一部分返回。get
的实现完全有可能返回对值的引用,或者将来可能会返回,因此编译器必须采取保守的方法并禁止它
但仅当两个函数都返回和[u8]
时
这是不准确的。get_和_increment
的返回类型对错误没有影响。get
的返回类型只在包含引用时才起作用
但是,您没有明显的理由返回引用:
pub fn get(&self) -> [u8; 2] {
[3; 2]
}
如果出于某种原因希望返回引用,则无需将其与self
的生存期绑定(您的代码这样做是因为):
另见:
pub fn get(&self) -> &'static [u8] {
&[3; 2]
}