Adiei esse dia por muito tempo, mas era impossível adiar para sempre. Bem, chegou a hora. É hora de finalmente entender as macros do Rust. Bem, ou pelo menos comece.
Vamos definir imediatamente porque você deseja usá-los. As macros tratam de metaprogramação e, pode-se até dizer, parcialmente de programação reflexiva. Claro, eu não sou um desenvolvedor de padrões e padrões, mas usar uma macro (declarada por macro_rules!) Como uma substituição para uma função é, na minha opinião, uma má ideia. Primeiro, porque uma função aceita variáveis de um tipo específico, e a macro que aceita uma variável não conhece seu tipo brega, portanto, o significado das operações pode ser entendido apenas pelo nome e pela assinatura da própria macro. E a sintaxe das macros não é tão óbvia ...
Mas espero que este artigo deixe isso mais claro para você.
Que tipo de besta é essa 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, - .
Isso, na verdade, é tudo. Escrever macros usando macro_rules não é tão difícil, o principal é entender as regras básicas. Talvez economize seus nervos e / ou dinheiro. Claro, eu não toquei no mais interessante neste artigo, este é o mais simples do que é. O objetivo deste artigo é mostrar que as macros são fáceis.
Escreva, se você quiser um artigo sobre proc_macro e syn, realmente há algo para ver.