gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:58:30 25 4
gpt4 key购买 nike

我正在学习 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);

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

最佳答案

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

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

宏不关心你使用了哪些语法1程序员关心您使用的语法。

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


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

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

// Not OK
dummy!()

// OK
dummy! {}

// OK
dummy!();

关于rust - 为什么我们使用方括号而不是定义它的圆括号来调用 vec 宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56464251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com