【问题标题】:Why do we call the vec macro using square brackets instead of the parenthesis it is defined with?为什么我们使用方括号而不是定义它的括号来调用 vec 宏?
【发布时间】:2019-10-21 04:28:08
【问题描述】:

我正在学习 Rust 宏,但在使用 vec 时对语法感到困惑。 source code 实现vec!

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

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

let v0 = vec![1, 2, 3];

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

let v1 = vec!(3; 1);
let v2 = vec!(1, 2, 3); 

v0相比,为什么我们在v1v2中使用[]而不是()

【问题讨论】:

标签: rust macros


【解决方案1】:

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

let a = vec!(0, 1, 2);
let b = vec![0, 1, 2];
let c = vec! { 0, 1, 2 };

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

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


1 - 调用宏时使用的大括号样式与分号之间存在小的交互作用。用作 itemstatement 的宏如果不使用花括号,则需要以分号结尾:

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

// Not OK
dummy!()

// OK
dummy! {} 

// OK
dummy!();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2021-01-17
    • 2015-06-29
    相关资源
    最近更新 更多