私はRustに関する本を読んでおり、Rust macrosで遊んでいます。すべてのメタ変数型がここに説明されており、最後のものを除いて例があります - tt
。本によると、それは「単一のトークンツリー」です。私は興味があります、それは何ですか?それは何のために使用されていますか?あなたは例を挙げていただけますか?Rustマクロでは、ttメタバリアブル型の意味は何ですか?
10
A
答えて
14
これは、マクロ呼び出しにあるものが()
,[]
、{}
のペアと正しく一致するように導入された概念です。
例えば、以下のプログラムのために:
fn main() {
println!("Hello world!");
}
トークンツリーは次のようになります
fn
main
()
- ∅
{ println!("Hello world!"); }
println
!
("Hello world!")
"Hello world!"
;
これは、単純なトークン(fn
、main
など)ツリーを形成葉であり、()
、[]
または{}
に囲まれたものは、サブツリーを持っています。 (
はトークンツリーに単独では表示されません。対応する)
と一致しないで(
と一致することはできません。例えば
:
macro_rules! {
(fn $name:ident $params:tt $body:tt) => { /* … */}
}
は$name → main
、$params →()
、$body → { println!("Hello world!"); }
と上記関数にマッチします。
トークンツリーは、最も要求の厳しいメタ変数タイプです。これは何でも一致します。これは、 "本当に気にしない"部分、特に "頭"と "尾"部分を持つマクロでよく使われます。たとえば、println!
マクロは、$fmt
がフォーマット文字列である($fmt:expr, $($arg:tt)*)
と一致するブランチを持ち、$($arg:tt)*
は「すべての残り」を意味し、ちょうどformat_args!
に転送されます。つまり、println!
は実際のフォーマットを知る必要はなく、複雑なマッチングを行う必要はありません。
関連する問題
- 1. このCマクロの意味は何ですか?
- 2. Rustのconst型をインライン化するのはどういう意味ですか?
- 3. {:?}はRust形式の文字列で何を意味しますか?
- 4. 客観的な意味での意味は何ですか?
- 5. 意味は何ですか - [[NodeJSでは?
- 6. NSDecimalAdd() - constの意味は何を意味するのですか?
- 7. ReactJSでは何の意味ですか?
- 8. MongoDBでの意味は何ですか?
- 9. Perlで@_の意味は何ですか?
- 10. Pythonの[...]の意味は何ですか?
- 11. Makefileの '%'の意味は何ですか?
- 12. タイコの$の意味は何ですか
- 13. "* ngFor"の "*"の意味は何ですか?
- 14. Perlの=〜の意味は何ですか?
- 15. numpyの '*'の意味は何ですか?
- 16. os.pathの "./"の意味は何ですか?
- 17. Goでは何が/ ...意味ですか?
- 18. CSSの意味は何ですか?
- 19. forループの意味は何ですか?
- 20. x [:] = yの意味は何ですか?
- 21. :: ::の意味は何ですか?
- 22. dylibファイルの意味は何ですか?
- 23. ngx_http_request_s :: extenの意味は何ですか
- 24. i = jの意味は何ですか -
- 25. AVErrorMediaServicesWereResetの意味は何ですか?
- 26. __dyld_dyld_fatal_error_disassemblyの意味は何ですか?
- 27. main_syntaxの意味は何ですか
- 28. Clojure: `と〜@の意味は何ですか?
- 29. タイプの意味は何ですか?
- 30. イベントプーリングの意味は何ですか?
良い説明と例をお寄せいただきありがとうございます。 –