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

Rust 为什么编译器不在声明性宏中自动添加双括号?,rust,rust-macros,Rust,Rust Macros,在声明性宏中创建标识符时,必须在宏双括号中加上其他括号。我想知道为什么编译器不总是添加额外的括号 示例1:此代码不会编译,因为在必须使用双括号的情况下,仅使用单括号: macro_rules! some_macro { () => { let mut x = 1; x += 1; x }; } fn main() { let y = some_macro!(); } 添加双括号可以解决编译错误 示例2:无论使用

在声明性宏中创建标识符时,必须在宏双括号中加上其他括号。我想知道为什么编译器不总是添加额外的括号

示例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!();
}

是否存在双括号宏会打断单括号宏的情况?如果不是,为什么编译器不总是添加双括号?

在这种情况下,双括号会失败。由于内部大括号创建了一个作用域,因此如果要声明任何标识符,将不会导出它们:

//使用单大括号编译,但不使用双大括号 宏规则!将_ident_设置为_1{ $var:ident=>{ 假设$var=1; } } fn干线{ 将_ident_设置为_1!foo; println!{},foo; } 也可能有不允许大括号直接向上的情况,比如顶级定义。例如,此宏包含重复的Deref实现:

结构Foo{ x:i32 } 结构条{ y:u32 } //使用单大括号编译,但不使用双大括号 宏规则!创建\u重复\u impl{ $prop:ident,$typ:ty,$target:ty=>{ $typ的impl std::ops::Deref{ 类型Target=$Target; fn deref&self->&self::Target{ &自我介绍。$prop } } } } 创建重复的应用程序!x、 Foo,i32; 创建重复的应用程序!y、 巴,u32; fn干线{ println!{:?},Foo{x:5}。已选中 }
在这种情况下,双支架会失效。由于内部大括号创建了一个作用域,因此如果要声明任何标识符,将不会导出它们:

//使用单大括号编译,但不使用双大括号 宏规则!将_ident_设置为_1{ $var:ident=>{ 假设$var=1; } } fn干线{ 将_ident_设置为_1!foo; println!{},foo; } 也可能有不允许大括号直接向上的情况,比如顶级定义。例如,此宏包含重复的Deref实现:

结构Foo{ x:i32 } 结构条{ y:u32 } //使用单大括号编译,但不使用双大括号 宏规则!创建\u重复\u impl{ $prop:ident,$typ:ty,$target:ty=>{ $typ的impl std::ops::Deref{ 类型Target=$Target; fn deref&self->&self::Target{ &自我介绍。$prop } } } } 创建重复的应用程序!x、 Foo,i32; 创建重复的应用程序!y、 巴,u32; fn干线{ println!{:?},Foo{x:5}。已选中 }