相关疑难解决方法(0)

如何在宏中允许可选的尾随逗号?

这是我想要的合成例子:

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)

macros rust

17
推荐指数
2
解决办法
1897
查看次数

为什么以及何时应该在块的末尾使用逗号?

在代码块可以以逗号结束或不以逗号结束时,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)

问题是为什么在块的末尾可以使用逗号?为什么语言中存在这种二元论,其原因是什么?

syntax idioms rust

5
推荐指数
1
解决办法
659
查看次数

为什么函数调用中的尾随逗号不是语法错误?

我希望这段代码失败,因为逗号充当参数分隔符.没有第二个参数,foo只接受一个参数.

fn foo(_a: u8) {}

fn main() {
    foo(3, );
}
Run Code Online (Sandbox Code Playgroud)

rust

2
推荐指数
1
解决办法
298
查看次数

标签 统计

rust ×3

idioms ×1

macros ×1

syntax ×1