Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 为什么返回a&;[u8]而不是来自函数的u8?_Rust_Borrow Checker_Borrowing - Fatal编程技术网

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