我正在学习 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)
为什么我们使用[]而不是()inv1并v2与 进行比较v0?
正如您所注意到的,您可以使用括号、方括号或大括号来调用宏:
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)
| 归档时间: |
|
| 查看次数: |
966 次 |
| 最近记录: |