次のコードは、macro_rule!
の制限の単純なテストです。それは正しく[1, 2]
をターゲットとして印刷します。私は[[1,2]
[[1,2],3]
に変更した場合Rustマクロは複数レイヤのネストされた式を扱うことができますか?
macro_rules! test {
($target:tt) => {
println!("{:?}", $target);
};
($target:tt, $($rest:tt),*) => {
test!($target)
};
([$target:tt, $($inner_rest:tt),*],$($rest:tt),*) => {
test!($target)
}
}
fn main() {
test![[1, 2], [[5, 6], 3], 4];
}
はしかし、コンパイラは文句:マクロが再帰的にブラケットに対処し、最初のアイテムを印刷できるようにする方法は
<anon>:16:15: 16:16 error: mismatched types:
expected `[_; 2]`,
found `_`
(expected array of 2 elements,
found integral variable) [E0308]
<anon>:16 test![[[1,2],3],[[5,6],3],4];
^
<std macros>:2:25: 2:56 note: in this expansion of format_args!
<std macros>:3:1: 3:54 note: in this expansion of print! (defined in <std macros>)
<anon>:4:5: 4:30 note: in this expansion of println! (defined in <std macros>)
<anon>:7:6: 7:20 note: in this expansion of test! (defined in <anon>)
<anon>:16:2: 16:31 note: in this expansion of test! (defined in <anon>)
<anon>:16:15: 16:16 help: see the detailed explanation for E0308
error: aborting due to previous error
playpen: application terminated with error code 101
ありますか?私はthe example given by the Rust documentationを勉強しましたが、私の場合はそれをどのように実装するかについてまだ考えていません。
ありがとうございました!私は再帰的なマクロで質問を更新しましたが、それでも動作しません。何が間違っているのか教えてください。 – divinites
@divinitesあなたはまだマクロに何をしたいのかを指定していませんか?私はあなたが望むものを推測しました。 –
ありがとう!それはまさに私が欲しいものです。 – divinites