首页 > 解决方案 > 文档是否提到在函数参数前添加“mut”关键字的可能性?

问题描述

我有一个基本的Reader封装一些通用元素:

pub struct Reader<R> {
    inner: R,
    order: Endian,
    first_ifd_offset: usize,
}

impl<R: Read + Seek> Reader<R> {
    pub fn new(reader: R) -> Result<Reader<R>> {
        let mut order_raw = [0, 0];
        reader.read_exact(&mut order_raw)?;
        let magic_number = u16::to_be(u16::from_bytes(order_raw));
        /* ... */
   }
}

这不会编译并产生以下错误:

error[E0596]: cannot borrow immutable argument `reader` as mutable
  --> src/reader.rs:17:9
   |
15 |     pub fn new(reader: R) -> Result<Reader<R>> {
   |                ------ consider changing this to `mut reader`
16 |         let mut order_raw = [0, 0];
17 |         reader.read_exact(&mut order_raw)?;
   |         ^^^^^^ cannot borrow mutably

当我按值获取参数时,该new函数应该是reader元素的新所有者。编译器建议我mut在函数参数前添加一个关键字。

文档是否提到在mut函数参数前添加关键字的可能性?我找不到提及它的资源。

标准库的BufReaderstruct 也有类似的new功能,在正文中不使用mut关键字,而是使用unsafe 块代码。是否unsafe阻止使用mut内部函数的签名?

标签: rustmutabilityfunction-signature

解决方案


我认为编译器非常精确地说明在哪里添加mut. 通常,编译器会尝试在特定位置下划线:

pub fn new(mut reader: R) -> Result<Reader<R>>

现在可以在函数中改变阅读器。这表现为:

pub fn new(reader: R) -> Result<Reader<R>, Error> {
    let mut reader = reader;
    // ...

据我所知,它在书中只提到过一次,但或多或​​少是一种模式,你也可以在函数中使用它

unsafe没有修复它,它是 UB

变异的非可变数据——即通过共享引用或let绑定拥有的数据到达的数据),除非该数据包含在UnsafeCell<U>.


推荐阅读