rust - 为什么解构借用的枚举需要取消引用其字段?

标签 rust reference pattern-matching borrow-checker borrowing

考虑以下代码段:

use std::fmt;

enum TestEnum {
    StructMem {value: i32, is_valid: bool},
    RandoMem,
}

impl fmt::Display for TestEnum {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        use TestEnum::*;
        match self {
            StructMem {value, is_valid} => {
                if *is_valid { // Why dereference is_valid ?
                    write!(f, "f")?
                }
                write!(f, "{:?}", value)
            }
            RandoMem => {
                f.write_str("Random")
            }
        }
    }
}
为什么我需要取消引用 is_validif陈述?
编辑:这个问题What is the syntax to match on a reference to an enum?似乎正在处理类似的情况,但答案都集中在解决特定问题(不涉及结构)上,并没有解释所有权/绑定(bind)语义。

最佳答案

这不是 match 所特有的。或 enum但由于 fmt() 的签名, 这需要 self作为引用( &self 而不是 self ,如果取得所有权)。match self ,因此,已经引用了 TestEnum 的借用实例和火柴臂StructMem {value, is_valid}通过引用( &i32&bool )绑定(bind)。这就是为什么is_valid最终成为 &bool ,而不是 bool .

关于rust - 为什么解构借用的枚举需要取消引用其字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66201228/

相关文章:

c - 为什么通过引用调用的函数在从 mex 包装器中的其他源文件链接时不起作用?

text - 如何使用 sed/awk 从文件中删除文本 block (模式)

java - 如何分别替换同一句话中相同的单词但不同的大小写?

memory - 为什么在使用不安全的 Rust 访问超出范围的变量时没有段错误?

c++ - 如何在不使用 variable_name.at() 的情况下引用字符串的最后一个字符?

javascript - 哪个维护: JavaScript function references or Boolean + IF conditions?效率更高

java - 增强现实中的模式匹配

io - 如何从 Vec 或 Slice 读取 (std::io::Read)?

rust - 使用沙沙本体时如何减少或加快重建速度?

binaryfiles - 用于检查 .rlib 二进制文件的 Rust 库