Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Rust中,是否可以接受属性宏中的任意语法?(与其他宏一样)_Rust_Macros_Attributes - Fatal编程技术网

在Rust中,是否可以接受属性宏中的任意语法?(与其他宏一样)

在Rust中,是否可以接受属性宏中的任意语法?(与其他宏一样),rust,macros,attributes,Rust,Macros,Attributes,在Rust中,声明性宏和过程性宏(macro\u rules!)都可以接受任意语法,只要它进行解析,这些语法就不一定是有效的Rust。例如,这用于创建一个宏,该宏从类似SQL的语法解析SQL查询 但是,在使用属性宏时,情况似乎并非如此。例如: #[my_attribute_macro] fn example() { impl A { impl B { // This is invalid Rust code (nested `impl`s) whi

在Rust中,声明性宏和过程性宏(
macro\u rules!
)都可以接受任意语法,只要它进行解析,这些语法就不一定是有效的Rust。例如,这用于创建一个宏,该宏从类似SQL的语法解析SQL查询

但是,在使用属性宏时,情况似乎并非如此。例如:

#[my_attribute_macro]
fn example() {
    impl A {
        impl B {
            // This is invalid Rust code (nested `impl`s) which is parsable
        }
    }
}

产生编译器错误,因为
impl
s不能嵌套在有效的Rust中。是否有任何方法可以绕过此限制,以获得与其他宏更相似的属性宏?

这可能是不可能的。属性语法需要解析它下面的函数(或结构或任何东西),以便它知道它所影响的项何时结束。也就是说,同样的限制也适用于类似函数的宏,它们还需要确定调用何时结束,所以我不确定区别在哪里。类似函数的宏只需要解析括号中的所有内容,这更简单(类似于
{$($tree:tt)*}
)。属性可能只是重用函数解析代码,该代码解析主体中的语句。理论上,编译器可以制作一个替代函数解析器,在解析函数的同时对主体执行与上述类似的操作,但这可能还没有完成。