尝试在宏扩展中实现特征时出现宏错误
Macro error while trying to implement a trait inside a macro expansion
fn a() {}
似乎满足预期 fn
然后是其他一些东西的解析规则。 item
s应该可以是函数定义吧?所以他们应该工作,对吧?
macro_rules! multi_impl {
(for $base:ty :
$($t:ty {
$($i:item);*
}),+) =>
{
$(
impl $t for $base
{
$( $i )*
}
)+
}
}
trait A {
fn a();
}
trait B {
fn b();
}
struct S;
multi_impl! {
for S:
A {
fn a() {}
}, B {
fn b() {}
}
}
fn main() {
S::a();
S::b();
}
有问题的错误:
error: expected one of `const`, `default`, `extern`, `fn`, `pub`, `type`, `unsafe`, or `}`, found `fn a() { }`
--> <anon>:11:20
|
11 | $( $i )*
| ^^
使其成为 $( fn $i)*
仅将错误更改为抱怨在 fn
之后需要一个标识符,这是有道理的,但最初的错误并没有(至少对我而言)。
对于源代码中的代码与通过宏放入源代码中的代码,解析器是否存在差异?
问题不在于 fn
不是项目,而是 impl
的主体不 包含项目。它包含 "impl items"。它抱怨的是你试图把一个方形的方块放进一个圆孔里,而不是方块的颜色不对。
是的,这是两个不同的东西。不,您不能 在宏中捕获 "impl items"。不,你不能把一个项目变成一个 impl 项目。因为宏捕获 AST 节点,而不是标记。好吧,方法可以有一个 self
参数,而常规函数则没有。我不知道,大概在当时看来是个好主意。
抛开假设的来回,在这种情况下的解决方案是不要费心尝试匹配 particular 中的任何内容而只匹配 anything.
macro_rules! multi_impl
{
(for $base:ty :
$($t:ty {
$($body:tt)*
}),+) =>
{
$(
impl $t for $base
{
$($body)*
}
)+
}
}
fn a() {}
似乎满足预期 fn
然后是其他一些东西的解析规则。 item
s应该可以是函数定义吧?所以他们应该工作,对吧?
macro_rules! multi_impl {
(for $base:ty :
$($t:ty {
$($i:item);*
}),+) =>
{
$(
impl $t for $base
{
$( $i )*
}
)+
}
}
trait A {
fn a();
}
trait B {
fn b();
}
struct S;
multi_impl! {
for S:
A {
fn a() {}
}, B {
fn b() {}
}
}
fn main() {
S::a();
S::b();
}
有问题的错误:
error: expected one of `const`, `default`, `extern`, `fn`, `pub`, `type`, `unsafe`, or `}`, found `fn a() { }`
--> <anon>:11:20
|
11 | $( $i )*
| ^^
使其成为 $( fn $i)*
仅将错误更改为抱怨在 fn
之后需要一个标识符,这是有道理的,但最初的错误并没有(至少对我而言)。
对于源代码中的代码与通过宏放入源代码中的代码,解析器是否存在差异?
问题不在于 fn
不是项目,而是 impl
的主体不 包含项目。它包含 "impl items"。它抱怨的是你试图把一个方形的方块放进一个圆孔里,而不是方块的颜色不对。
是的,这是两个不同的东西。不,您不能 在宏中捕获 "impl items"。不,你不能把一个项目变成一个 impl 项目。因为宏捕获 AST 节点,而不是标记。好吧,方法可以有一个 self
参数,而常规函数则没有。我不知道,大概在当时看来是个好主意。
抛开假设的来回,在这种情况下的解决方案是不要费心尝试匹配 particular 中的任何内容而只匹配 anything.
macro_rules! multi_impl
{
(for $base:ty :
$($t:ty {
$($body:tt)*
}),+) =>
{
$(
impl $t for $base
{
$($body)*
}
)+
}
}