私はこの日を長い間延期しましたが、永遠に延期することは不可能でした。さて、時が来ました。いよいよRustマクロを理解する時が来ました。まあ、または少なくとも開始します。
それらを使用する理由をすぐに定義しましょう。マクロはメタプログラミングに関するものであり、部分的にはリフレクションプログラミングに関するものです。もちろん、私はパターンや標準の開発者ではありませんが、関数の代わりにマクロ(macro_rulesで宣言されています!)を使用することは、私の意見では悪い考えです。まず、関数は特定の型の変数を受け入れ、変数を受け入れるマクロはその型cornyを知らないため、操作の意味は、マクロ自体の名前と署名によってのみ理解できます。そして、マクロの構文はそれほど明白ではありません...
しかし、うまくいけば、この記事があなたにとってそれをより明確にするでしょう。
このmacro_rulesはどんな獣なのか!?
. macro_rules! - , . - , , unwrap. , , , .
, .
macro_rules! uncover{
($var:ident) => {
match $var{
Some(t) => t,
None => panic!("None value")
}
}
}
fn main(){
let x = Some(2i32);
let unwrapped = uncover!(x);
println!("{}", unwrapped);
}
-… . ? -, uncover:
macro_rules! uncover
- , , . , $var - , uncover ( , ).
, Rust , , : . , ? , . :
let unwrapped = uncover!(x);
:
let unwrapped = match x{
Some(t) => t,
None => panic!(“None value”)
};
- . , ( - inline-).
let x = 2i32;
let unwrapped = uncover!(x);
, - . -, , .
Summary
, , , ? , . , , ? O(1) : list![1,2,3] ? ? , macro_rules! -, , proc_macro, syn, qoute TokenTree, - .
実際、それがすべてです。macro_rulesを使用してマクロを作成することはそれほど難しくありません。主なことは、基本的なルールを理解することです。多分それはあなたの神経やお金を節約するでしょう。もちろん、私はこの記事で最も興味深いものには触れませんでした。これは最も単純なものです。この記事の目的は、マクロが簡単であることを示すことです。
proc_macroとsynに関する記事が必要な場合は、実際に見るべきものがあります。