代码之家  ›  专栏  ›  技术社区  ›  yageek

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

  •  0
  • yageek  · 技术社区  · 7 年前

    我有一个基本的 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 函数参数前面的关键字。

    文档中是否提到了添加 穆特 函数参数前的关键字?我找不到提到它的资料。

    这个 BufReader 标准库的结构具有 类似的 新的 函数,不使用 穆特 关键字,但 unsafe 正文中的块代码。做 不安全的 防止使用 穆特 在函数的签名内?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Tim Diekmann suresh madaparthi    7 年前

    我认为编译器非常精确地指出在哪里添加 mut 是的。通常,编译器会尝试在特定位置加下划线:

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

    现在可以在函数中对读取器进行变异。其行为如下:

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

    据我所知,只是 mentioned once 在书中,但或多或少地 这是一个模式,你也可以在函数中使用它 是的。

    unsafe does not fix it, it's UB 以下内容:

    变异不可变数据——即通过共享引用或由 let 绑定),除非该数据包含在 UnsafeCell<U> 是的。

        2
  •  2
  •   Tim Diekmann suresh madaparthi    7 年前

    它隐含在书中,但没有直接提到。两者 let 函数参数是模式,所以可以使用 mut 在里面 ,您可以在参数中使用它。

    推荐文章