我想把我的if箱换成match

struct Point {
    x: i32,
}

fn main() {
    let p = Point { x: 0 };
    let q = Point { x: 0 };
    
    if p.x == q.x {
        println!("p and q have same x: {0}", p.x);
    } else {
        println!("p and q doesn't have same x value");
    }
    
    // match p.x {
    //     q.x => println!("p and q have same x: {0}", p.x),
    //     _ => println!("On neither axis"),
    // }
}

它可以正常运行.但是,当我在代码中取消对代码片段的注释时,就会出现错误.

error: expected one of `,`, `=>`, `@`, `if`, `|`, or `}`, found `.`
  --> src/main.rs:16:10
   |
16 |         q.x => println!("p and q have same x: {0}", p.x),
   |          ^ expected one of `,`, `=>`, `@`, `if`, `|`, or `}`

我不知道该如何修复它

推荐答案

只能比较const个值,并且无法将非const变量转换为const.但是,可以使用保护表达式.

match p.x {
    v if p.x == q.x => println!("p and q have same x: {0}", v),
    _ => println!("On neither axis"),
}

Rust相关问答推荐

空字符串转换为Box字符串时是否分配?<>

是否可以为`T:Copy`执行`T. clone`的测试

限制未使用的泛型导致编译错误

在Rust中,在实现特征`Display`时,如何获取调用方指定的格式?

如何正确地将App handler传递给Tauri中的其他模块?

Gtk4-rs:将监视器作为gdk::monitor获取,而不是作为glib::对象获取

重写Rust中的方法以使用`&;mut self`而不是`mut self`

如何向下转换到MyStruct并访问Arc Mutex MyStruct实现的方法?

为什么Option类型try块需要类型注释?

Windows 上 ndarray-linalg 与 mkl-stats 的链接时间错误

一旦令牌作为文字使用,声明宏不匹配硬编码值?

是否可以通过可变引用推进可变切片?

在 Rust 中实现资源消耗的安全包装器

如何连接 Rust 中的相邻切片

当 T 不是副本时,为什么取消引用 Box 不会抱怨移出共享引用?

判断 is_ok 后重用结果

为什么指定生命周期让我返回一个引用?

如何在 Rust 中编写修改 struct 的函数

相交着色器从 SSBO 中读取零

为什么可以从闭包中返回私有 struct