fn a() {}
は、fn
を期待する解析ルールを満たしているようです。 item
は関数定義でなければなりません。そう、彼らはうまくいくはずですよね?マクロ展開内で特性を実装しようとしたときにマクロエラーが発生しました
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();
}
問題のエラー:それ$(fn $i)*
作る
error: expected one of `const`, `default`, `extern`, `fn`, `pub`, `type`, `unsafe`, or `}`, found `fn a() { }`
--> <anon>:11:20
|
11 | $($i)*
| ^^
だけ理にかなっている、fn
後の識別子を期待して文句を言うために、エラーを変更しますが、最初のエラーはありません(少なくとも私にとっては)。
マクロによってソースに配置されたソースコードとコードの間にパーサーとの違いはありますか?