rust实战系列五十二:下划线

本文详细介绍了下划线在Rust编程中的多种用途,包括模式匹配时的占位符、函数参数的解构,以及所有权转移和特殊场景下的使用规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下划线还能用在模式匹配的各种地方,用来表示一个占位符,虽然匹配到了但
是忽略它的值的情况:
struct P(f32, f32, f32);
fn calc(arg: P) -> f32 {
// 匹配 tuple struct,但是忽略第二个成员的值 let P(x, _, y) = arg;
xx+yy
}
fn main() {
let t = P(1.0, 2.0, 3.0);
println!(“{}”, calc(t));
}
对于上例,实际上我们还能写得更简略一点。因为函数参数本身就具备“模式 解构”功能,我们可以直接在参数中完成解构:

struct P(f32, f32, f32);
// 参数类型是 P,参数本身是一个模式,解构之后,变量x、y分别绑定了第一个和第三个成员 fn calc(P(x, , y): P) -> f32 {
xx+yy }
fn main() {
let t = P(1.0, 2.0, 3.0);
println!(“{}”, calc(t));
}
另外需要提醒的一点是,下划线更像是一个“关键字”,而不是普通的“标识 符”(identifier),把它当成普通标识符使用是会有问题的。举例如下:
fn main() {
let _ = 1_i32;
let x = _ + ;
println!(“{}”, x);
}
编译可见,编译器并不会把单独的下划线当成一个正常的变量名处理:
error: expected expression, found _
–> test.rs:4:13
|
4 | let x = _ + ;
|^
error[E0425]: cannot find value x in this scope
如果把下划线后面跟上字母、数字或者下划线,那么它就可以成为一个正常的 标识符了。比如,连续两个下划线
,就是一个合法的、正常的“标识符”。
let
=x;和let_y=x;具有不一样的意义。这一点在后面的“析构函数”部分还会 继续强调。如果变量x是非Copy类型,let_=x;的意思是“忽略绑定”,此时会直接调 用x的析构函数,我们不能在后面使用下划线_读取这个变量的内容;而let_y=x;的 意思是“所有权转移”,_y是一个正常的变量名,x的所有权转移到了_y上,_y在后 面可以继续使用。
下划线在Rust里面用处很多,比如:在match表达式中表示“其他分支”,在模式 中作为占位符,还可以在类型中做占位符,在整数和小数字面量中做连接符,等 等。
除了下划线可以在模式中作为“占位符”,还有两个点…也可以在模式中作为“占 位符”使用。下划线表示省略一个元素,两个点可以表示省略多个元素。比如:
fn main() {
let x = (1, 2, 3);
let (a, _) = x; // 模式解构 println!(“{}”, a);
}
如果我们希望只匹配tuple中的第一个元素,其他的省略,那么用一个下划线是 不行的,因为这样写,左边的tuple和右边的tuple不匹配。修改方案有两种。一种 是:
let (a, _, _) = x; // 用下划线,那么个数要匹配

另一种是:
let (a, …) = x; // 用两个点,表示其他的全部省略
let (a, …, b) = x;// 用两个点,表示只省略所有元素也是可以的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

断水流大撕兄

你的鼓励,就是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值