这是我想要的合成例子:
macro_rules! define_enum {
($Name:ident { $($Variant:ident),* }) => {
pub enum $Name {
None,
$($Variant),*,
}
}
}
define_enum!(Foo { A, B });
Run Code Online (Sandbox Code Playgroud)
此代码编译,但如果添加逗号:
define_enum!(Foo { A, B, });
// ^
Run Code Online (Sandbox Code Playgroud)
编译失败.我可以解决它:
($Name:ident { $($Variant:ident,)* })
// ^
Run Code Online (Sandbox Code Playgroud)
但后来define_enum!(Foo { A, B });失败了,
我应该如何编写一个宏来处理这两种情况:
define_enum!(Foo { A, B });
define_enum!(Foo { A, B, });
Run Code Online (Sandbox Code Playgroud) 在代码块可以以逗号结束或不以逗号结束时,Rust中存在许多情况.例如:
enum WithoutComma
{
x,
y
}
Run Code Online (Sandbox Code Playgroud)
要么
enum WithComma
{
x,
y,
}
Run Code Online (Sandbox Code Playgroud)
还有其他"匹配"等的例子.似乎两种变体都会产生相同的结果.现在我知道放置或删除逗号更改行为的唯一情况,它是1元素元组声明(但它不是块):
let just_int = (5);
let tuple = (5,);
Run Code Online (Sandbox Code Playgroud)
问题是为什么在块的末尾可以使用逗号?为什么语言中存在这种二元论,其原因是什么?
我希望这段代码失败,因为逗号充当参数分隔符.没有第二个参数,foo只接受一个参数.
fn foo(_a: u8) {}
fn main() {
foo(3, );
}
Run Code Online (Sandbox Code Playgroud)