文档中是否提到了在函数参数前添加 `mut` 关键字的可能性?

Does the documentation mention the possibility of adding the `mut` keyword in front of functions' arguments?

我有一个基本的 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 关键字的可能性?我找不到提及它的资源。

标准库的BufReader结构有一个 类似 new 函数,不使用 mut 关键字而是 unsafe 正文中的块代码。 unsafe 是否阻止在函数签名中使用 mut

我认为编译器在说明添加 mut 的位置时非常准确。通常编译器会尝试在特定的地方加下划线:

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

现在可以改变函数中的 reader。这表现为:

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

据我所知,书上只是mentioned once,但或多或​​少是某种意义上的它是一种模式,你也可以在函数中使用它

unsafe does not fix it, it's UB:

Mutating non-mutable data — that is, data reached through a shared reference or data owned by a let binding), unless that data is contained within an UnsafeCell<U>.

书中暗含但未直接提及。 let 和函数参数都是模式,所以就像你可以在 let 中使用 mut 一样,你也可以在参数中使用它。