【问题标题】:Why does a level of indirection allow omitting `mut`?为什么间接级别允许省略“mut”?
【发布时间】:2021-12-19 00:37:09
【问题描述】:

为什么write1 的参数不需要设置为 mut?它将值直接传递给另一个需要mut 访问权限的函数。

write1 中需要mut 的任何理由似乎都适用于write2,但编译器不同意:

use std::io::Write;

fn main() {
    let out = &mut std::io::stdout();
    write1(out)
}

fn write1(mut out: impl Write) {      // `mut` not required. Adding `mut` produces warning: "variable does not need to be mutable"
    write2(out)
}

fn write2(mut out: impl Write) {  // `mut` required! Otherwise error "cannot borrow `out` as mutable, as it is not declared as mutable"
    writeln!(out, "hi").unwrap();
}

playground link

【问题讨论】:

    标签: rust borrow-checker


    【解决方案1】:

    write1 中,您并没有改变out,而是将它(移动)给write2,就像main 将它移动到write1 一样。

    write2 可能像这样更清晰:

    fn write2(out: impl Write) {
        let mut out = out;
        writeln!(out, "hi").unwrap();
    }
    

    引用会非常不同。在这种情况下,您可以按照直觉传播 mut:

    fn main() {
        let mut out = &mut std::io::stdout();
        write1(&mut out)
    }
    
    fn write1(out: &mut impl Write) {
        write2(out)
    }
    
    fn write2(out: &mut impl Write) {
        writeln!(out, "hi").unwrap();
    }
    

    【讨论】:

    • 谢谢。 &mut 很容易理解,但我很难用语言表达 mut 在参数和 lets 中的含义。因为 Rust 书从不解释 mut 模式,而 Rust 参考也没有。模式中的mut 是否在任何地方进行了解释?我能找到的最接近的是doc.rust-lang.org/stable/reference/…,但这仅解释了语法。
    • "mut" 在mut&mut 中的含义不同。在第一种情况下,您可以改变值。在第二种情况下,您有一个 exclusive 引用,这使得所有其他引用在它处于活动状态时都是不可能的。这对你的直觉有帮助吗?
    • 谢谢,您的回答帮助理清了我的直觉并回答了我最初的问题。也就是说,我不确定我可以在标识符模式中定义mut,并且正在寻找一个定义——如果文档中还没有我希望添加这样一个定义:github.com/rust-lang/rust/issues/90605跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 2016-01-25
    • 2022-11-23
    • 2011-09-13
    • 2015-05-20
    • 2016-09-21
    • 1970-01-01
    相关资源
    最近更新 更多