为什么我们使用方括号而不是定义它的括号来调用 vec 宏?

Ant*_*ect 5 macros rust

我正在学习 Rust 宏,并且在使用vec. 实现的源代码vec!

macro_rules! vec {
    ($elem:expr; $n:expr) => (
        $crate::vec::from_elem($elem, $n)
    );
    ($($x:expr),*) => (
        <[_]>::into_vec(box [$($x),*])
    );
    ($($x:expr,)*) => (vec![$($x),*])
}
Run Code Online (Sandbox Code Playgroud)

让我们忘记使用它的标准方法:

let v0 = vec![1, 2, 3];
Run Code Online (Sandbox Code Playgroud)

如果我们查看源代码,我们不应该像下面那样使用它吗?

let v1 = vec!(3; 1);
let v2 = vec!(1, 2, 3); 
Run Code Online (Sandbox Code Playgroud)

为什么我们使用[]而不是()inv1v2与 进行比较v0

She*_*ter 7

正如您所注意到的,您可以使用括号、方括号或大括号来调用宏:

let a = vec!(0, 1, 2);
let b = vec![0, 1, 2];
let c = vec! { 0, 1, 2 };
Run Code Online (Sandbox Code Playgroud)

宏不关心您使用这些语法中的哪一种1程序员关心您使用哪种语法。

Rust 的数组和切片语法使用方括号,而Vecs 与这两者高度相关。使用方括号构造 aVec只是语言约定。Rustfmt 会自动将调用转换vec!为方括号。


1 - 在调用宏和分号时使用的大括号样式之间有一个小的交互。如果用作项目语句的宏不使用花括号,则需要以分号结尾:

macro_rules! dummy {
    () => {};
}

// Not OK
dummy!()

// OK
dummy! {} 

// OK
dummy!();
Run Code Online (Sandbox Code Playgroud)