当我编译这段代码时

    fn read(&mut self) -> Result<u8, &str> {
        if self.pos >= 512 {
            return Err("End of buffer".into());
        }
        let res = self.buf[self.pos];
        self.pos += 1;

        Ok(res)
    }
    

    fn read_u16(&mut self) -> Result<u16, &str> {
        let res = ((self.read()? as u16) << 8) | (self.read()? as u16);
        Ok(res)
    }

编译器抛出以下错误

error[E0499]: cannot borrow `*self` as mutable more than once at a time
  --> src/byte_packet_buffer.rs:53:51
   |
52 |     fn read_u16(&mut self) -> Result<u16, &str> {
   |                 - let's call the lifetime of this reference `'1`
53 |         let res = ((self.read()? as u16) << 8) | (self.read()? as u16);
   |                     ------------                  ^^^^^^^^^^^ second mutable borrow occurs here
   |                     |
   |                     first mutable borrow occurs here
   |                     returning this value requires that `*self` is borrowed for `'1`

For more information about this error, try `rustc --explain E0499`.
error: could not compile `dns_self` due to previous error

但是,如果我将返回值从&str修改为String,则编译时不会出错.

有没有人能解释为什么我在返回&str时会出错,但在返回String时却不会?

推荐答案

因为您没有指定任何生命周期,所以拉斯特将根据elision rules推断它们为:

fn read<'a>(&'a mut self) -> Result<u8, &'a str>

这意味着,只要你把Result或它包含的任何东西放在身边,它就会推断出self是被借走的. 要修复它,您只需指定返回的str的生存期,因为它无论如何都是静态的.

fn read(&mut self) -> Result<u8, &'static str>

Rust相关问答推荐

go 掉包装 struct 中的泛型

把Vector3变成Vector4的绝妙方法

使用Rust s serde_json对混合数据类型进行优化'

borrow 和内部IntoIterator

为什么我可以跟踪以前borrow 过的变量?房主在哪里?

当rust中不存在文件或目录时,std::FS::File::Create().unwire()会抛出错误

你是如何在铁 rust 一侧的金牛座获得应用程序版本的?

替换可变引用中的字符串会泄漏内存吗?

无法从流中读取Redis请求

在我的Cargo 中,当我在建筑物中使用时,找不到我可以在产品包中使用的 crate .r我如何解决这个问题?

我可以在不收集或克隆的情况下,将一个带有Item=(key,val)的迭代器拆分成单独的key iter和val iter吗?

Windows 上 ndarray-linalg 与 mkl-stats 的链接时间错误

如何使用tracing-subscriberRust crate 构建多编写者、全局过滤订阅者

为什么 Rust 字符串没有短字符串优化 (SSO)?

如何保存指向持有引用数据的指针?

通过mem::transmute将数组展平安全吗?

为什么传递 option.as_ref 的行为不同于使用匹配块并将内部映射到 ref 自己?

为什么我可以同时传递可变和不可变引用?

我如何将特征作为 struct 的拥有字段?

返回引用的返回函数