用于分隔匹配表达式的两臂时,大括号和逗号有什么区别?
What is the difference between braces and commas when used to separate arms of a match expression?
我刚开始学习 Rust,有些事情让我感到困惑。
我读了这本书的第 2 章,编写一个猜谜游戏,代码的某些部分让我想知道什么是对的,什么是错的。
示例:
这是我在 another question:
中询问的一个循环
loop {
...
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => {
println!("You win!");
break;
}
}
}
我意识到我可以这样写:
match guess.cmp(&secret_number) {
Ordering::Less => {
println!("Too low!") // without semicolon ;
} // without comma ,
Ordering::Greater => {
println!("Too high!")
}
Ordering::Equal => {
println!("You win!!!");
break;
}
}
我觉得这很混乱,我不知道它是好是坏,是否会导致未来的重大变化......
谁能帮我理解一下?
如果使用大括号,匹配臂末尾的逗号是可选的。 rust parser/tokenizer 可以明确地解析带或不带逗号的匹配臂。 Look here:逗号是可选的。
任何以分号结尾的语句都没有 return 任何值(期望 return <>; 语句)。
第一种情况,
Ordering::Less => println!("Too small!"),
// Returns a unit value
在第二种有大括号的情况下,没有分号的最后一行将被 returned。在这种情况下,它是 unit value.
看这个例子:
let flag = false;
let result = match flag {
false => {
println!("in false arm");
100
},
true => {
println!("In true arm");
200
}
};
println!("result = {}", result);
这将打印以下内容:
in false arm
result = 100
我刚开始学习 Rust,有些事情让我感到困惑。
我读了这本书的第 2 章,编写一个猜谜游戏,代码的某些部分让我想知道什么是对的,什么是错的。
示例: 这是我在 another question:
中询问的一个循环 loop {
...
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => {
println!("You win!");
break;
}
}
}
我意识到我可以这样写:
match guess.cmp(&secret_number) {
Ordering::Less => {
println!("Too low!") // without semicolon ;
} // without comma ,
Ordering::Greater => {
println!("Too high!")
}
Ordering::Equal => {
println!("You win!!!");
break;
}
}
我觉得这很混乱,我不知道它是好是坏,是否会导致未来的重大变化...... 谁能帮我理解一下?
如果使用大括号,匹配臂末尾的逗号是可选的。 rust parser/tokenizer 可以明确地解析带或不带逗号的匹配臂。 Look here:逗号是可选的。
任何以分号结尾的语句都没有 return 任何值(期望 return <>; 语句)。
第一种情况,
Ordering::Less => println!("Too small!"),
// Returns a unit value
在第二种有大括号的情况下,没有分号的最后一行将被 returned。在这种情况下,它是 unit value.
看这个例子:
let flag = false;
let result = match flag {
false => {
println!("in false arm");
100
},
true => {
println!("In true arm");
200
}
};
println!("result = {}", result);
这将打印以下内容:
in false arm
result = 100