如何在Rust中匹配结构体字段?

41

Rust可以匹配结构体字段吗?例如,以下代码:

struct Point {
    x: bool,
    y: bool,
}

let point = Point { x: false, y: true };

match point {
    point.x => println!("x is true"),
    point.y => println!("y is true"),
}

应该得到的结果为:

y is true

2
你如何建议使其能够处理非布尔值字段?例如,如何处理这个 struct Person { surname: String, age: u8 } - Matthieu M.
2个回答

72

Rust是否可以匹配结构体字段?

在Rust书的"解构结构体"章节中有详细描述。

match point {
    Point { x: true, .. } => println!("x is true"),
    Point { y: true, .. } => println!("y is true"),
    _ => println!("something else"),
}

5

您提供的语法在技术上没有意义,看起来您只是想使用普通的if语句:

if point.x { println!("x is true") }
if point.y { println!("y is true") }

我强烈建议重新阅读Rust编程语言,特别是关于以下章节:

阅读完后,你会明白point.x不是一个模式,因此不能用于匹配语句的左侧。


3
大多数函数式编程语言都具有这些功能,实际上非常有用,可以避免嵌套的if/else语句,因为常规底层语言如果没有模式匹配,则需要使用这种方式。所以,我建议你阅读一下模式匹配的相关资料 :D - Marcelo Boeira
@MarceloBoeira 我非常熟悉Rust的模式匹配。你会注意到我已经链接了两个特定的文档来涵盖它们。OP的请求并不是关于Rust中表达的模式匹配。他们甚至没有表达当两个字段都为真时应该发生什么。 - Shepmaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接