gpt4 book ai didi

rust - 为什么编译器不自动在声明性宏中添加双括号?

转载 作者:行者123 更新时间:2023-12-03 11:32:32 27 4
gpt4 key购买 nike

在声明性宏中创建标识符时,必须在宏中放置其他括号(双括号)。我想知道为什么编译器不仅仅(总是)添加额外的括号。
示例1 :该代码将不会编译,因为仅使用了一个方括号,其中必须使用双括号:

macro_rules! some_macro {
() => {
let mut x = 1;

x += 1;

x
};
}

fn main() {
let y = some_macro!();
}
添加双括号可解决编译错误。
示例2 :无论使用单括号还是双括号,该代码都将编译:
macro_rules! some_macro {
() => {{
1
}};
}

fn main() {
let y = some_macro!();
}
在某些情况下,带有双括号的宏会破坏单括号宏吗?如果不是,为什么编译器不总是加双括号?

最佳答案

在某些情况下,双括号会失败。由于内部花括号创建了作用域,因此,如果您要声明任何标识符,则不会“导出”它们:

// compiles with single braces but not double braces
macro_rules! set_ident_to_1 {
($var: ident) => {
let $var = 1;
}
}

fn main() {
set_ident_to_1!(foo);
println!("{}", foo);
}
在某些情况下,也可能不允许使用大括号,例如顶层定义。以这个宏为例,该宏创建了一个重复的 Deref实现:
struct Foo {
x: i32
}

struct Bar {
y: u32
}

// compiles with single braces but not double braces
macro_rules! create_repetitive_impl {
($prop: ident, $typ: ty, $target: ty) => {
impl std::ops::Deref for $typ {
type Target = $target;

fn deref(&self) -> &Self::Target {
&self.$prop
}
}
}
}

create_repetitive_impl!(x, Foo, i32);
create_repetitive_impl!(y, Bar, u32);

fn main() {
println!("{:?}", Foo {x: 5}.checked_mul(6))
}

关于rust - 为什么编译器不自动在声明性宏中添加双括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64844127/

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