Rust从入门到实战系列二百一十七:用 .. 忽略剩余值

本文介绍了Rust编程中的…语法,如何在match表达式中仅操作结构体如Point中的特定字段(如x坐标),以及在元组中匹配特定值(如first和last)的同时忽略其他值。文中提到使用…避免冗长的忽略列表,并强调了在确保无歧义性的前提下使用该语法的重要性。
摘要由CSDN通过智能技术生成

对于有多个部分的值,可以使用 … 语法来只使用部分并忽略其它值,同时避免不得不每一个忽略值列出
下划线。 … 模式会忽略模式中剩余的任何没有显式匹配的值部分。在示例 18-23 中,有一个 Point 结构
体存放了三维空间中的坐标。在 match 表达式中,我们希望只操作 x 坐标并忽略 y 和 z 字段的值:

fn main() {

struct Point {
x: i32,
y: i32,
z: i32,
}
let origin = Point { x: 0, y: 0, z: 0 };
match origin {
Point { x, … } => println!(“x is {}”, x),
}

}

示例 18-23: 通过使用 … 来忽略 Point 中除 x 以外的字段
这里列出了 x 值,接着仅仅包含了 … 模式。这比不得不列出 y: _ 和 z: _ 要来得简单,特别是在处理有
很多字段的结构体,但只涉及一到两个字段时的情形。
… 会扩展为所需要的值的数量。示例 18-24 展示了元组中 … 的应用:
文件名: src∕main.rs
fn main() {
let numbers = (2, 4, 8, 16, 32);
match numbers {
(first, …, last) => {
println!(“Some numbers: {}, {}”, first, last);
}
}
}
示例 18-24: 只匹配元组中的第一个和最后一个值并忽略掉所有其它值
这里用 first 和 last 来匹配第一个和最后一个值。 … 将匹配并忽略中间的所有值。
然而使用 … 必须是无歧义的。如果期望匹配和忽略的值是不明确的,Rust 会报错。示例 18-25 展示了
一个带有歧义的 … 例子,因此其不能编译:
文件名: src∕main.rs
fn main() {
let numbers = (2, 4, 8, 16, 32);
match numbers {
(…, second, …) => {
println!(“Some numbers: {}”, second)
},
}
}
尝试以有歧义的方式运用 …
如果编译上面的例子,会得到下面的错误:
$ cargo run
Compiling patterns v0.1.0 (file:///projects/patterns)
error: .. can only be used once per tuple pattern
–> src/main.rs:5:22
|
5 | (…, second, …) => {
| – ^^ can only be used once per tuple pattern
| |
| previously used here
error: could not compile patterns due to previous error
Rust 不可能决定在元组中匹配 second 值之前应该忽略多少个值,以及在之后忽略多少个值。这段代码
可能表明我们意在忽略 2,绑定 second 为 4,接着忽略 8、16 和 32;抑或是意在忽略 2 和 4,绑定
second 为 8,接着忽略 16 和 32,以此类推。变量名 second 对于 Rust 来说并没有任何特殊意义,所
以会得到编译错误,因为在这两个地方使用 … 是有歧义的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值