我看到了其他一些问题answers https://stackoverflow.com/a/25877389/221955说明let _ = foo()
在语句末尾而不是在作用域退出时销毁结果,这就是let _a = foo()
does.
我找不到任何官方描述,也找不到这种语法的任何理由。
我对一些相互交织的事情感兴趣:
- 官方文档中是否有提及?
- 这一选择背后的历史背景是什么?这只是 Rust 绑定/解构规则的自然结果吗?它是从另一种语言继承的吗?还是有其他的起源?
- 该语法是否存在某些使用显式作用域无法实现的用例?
这只是 Rust 绑定/解构规则的自然结果吗?
是的。你用_
表明您不关心模式中的值,并且它不应该首先被绑定。如果一个值从未绑定到变量,则没有任何东西可以保留该值,因此必须删除它。
所有地方都可以使用图案 https://doc.rust-lang.org/book/second-edition/ch18-01-all-the-places-for-patterns.html:
-
match
Arms
- 有条件的
if let
表达式
-
while let
条件循环
-
for
Loops
-
let
声明
- 功能参数
官方文档中是否有提及?
忽略整个值_ https://doc.rust-lang.org/book/second-edition/ch18-03-pattern-syntax.html#ignoring-an-entire-value-with-_
值得注意的是_
isn't 有效的标识符 https://doc.rust-lang.org/reference/identifiers.html,因此您不能将其用作名称:
fn main() {
let _ = 42;
println!("{}", _);
}
error: expected expression, found reserved identifier `_`
--> src/main.rs:3:20
|
3 | println!("{}", _);
| ^ expected expression
使用显式范围界定来实现
我想你可以走这条路,让表达式这样做只是“徘徊”,直到范围结束,但我没有看到它有任何价值:
let _ = vec![5];
vec![5]; // Equivalent
// Gotta wait for the scope to end to clean these up, or call `drop` explicitly
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)