Code:
<span>// Define the macro.</span><span>macro_rules!</span> <span>log_function</span> <span>{</span><span>(</span><span>$f:ident</span><span>(</span><span>$</span><span>(</span><span>$arg:expr</span><span>),</span><span>*</span><span>))</span> <span>=></span> <span>{{</span><span>println!</span><span>(</span><span>"Calling function: {}"</span><span>,</span> <span>stringify!</span><span>(</span><span>$f</span><span>));</span><span>$f</span><span>(</span><span>$</span><span>(</span><span>$arg</span><span>),</span><span>*</span><span>)</span><span>}};</span><span>}</span><span>// Some function for demonstration.</span><span>fn</span> <span>add</span><span>(</span><span>x</span><span>:</span> <span>i32</span><span>,</span> <span>y</span><span>:</span> <span>i32</span><span>)</span> <span>-></span> <span>i32</span> <span>{</span><span>x</span> <span>+</span> <span>y</span><span>}</span><span>fn</span> <span>main</span><span>()</span> <span>{</span><span>// Use the macro.</span><span>let</span> <span>result</span> <span>=</span> <span>log_function!</span><span>(</span><span>add</span><span>(</span><span>5</span><span>,</span> <span>7</span><span>));</span><span>println!</span><span>(</span><span>"Result: {}"</span><span>,</span> <span>result</span><span>);</span><span>}</span><span>// Define the macro.</span> <span>macro_rules!</span> <span>log_function</span> <span>{</span> <span>(</span><span>$f:ident</span><span>(</span><span>$</span><span>(</span><span>$arg:expr</span><span>),</span><span>*</span><span>))</span> <span>=></span> <span>{{</span> <span>println!</span><span>(</span><span>"Calling function: {}"</span><span>,</span> <span>stringify!</span><span>(</span><span>$f</span><span>));</span> <span>$f</span><span>(</span><span>$</span><span>(</span><span>$arg</span><span>),</span><span>*</span><span>)</span> <span>}};</span> <span>}</span> <span>// Some function for demonstration.</span> <span>fn</span> <span>add</span><span>(</span><span>x</span><span>:</span> <span>i32</span><span>,</span> <span>y</span><span>:</span> <span>i32</span><span>)</span> <span>-></span> <span>i32</span> <span>{</span> <span>x</span> <span>+</span> <span>y</span> <span>}</span> <span>fn</span> <span>main</span><span>()</span> <span>{</span> <span>// Use the macro.</span> <span>let</span> <span>result</span> <span>=</span> <span>log_function!</span><span>(</span><span>add</span><span>(</span><span>5</span><span>,</span> <span>7</span><span>));</span> <span>println!</span><span>(</span><span>"Result: {}"</span><span>,</span> <span>result</span><span>);</span> <span>}</span>// Define the macro. macro_rules! log_function { ($f:ident($($arg:expr),*)) => {{ println!("Calling function: {}", stringify!($f)); $f($($arg),*) }}; } // Some function for demonstration. fn add(x: i32, y: i32) -> i32 { x + y } fn main() { // Use the macro. let result = log_function!(add(5, 7)); println!("Result: {}", result); }
Enter fullscreen mode Exit fullscreen mode
Output:
Calling <span>function</span>: addResult: 12Calling <span>function</span>: add Result: 12Calling function: add Result: 12
Enter fullscreen mode Exit fullscreen mode
Rust may not come with built-in support for Python-esque decorators, but that doesn’t mean we can’t engineer our own! With the might of Rust’s macro system at our disposal, we demonstrate how to craft a Python-style decorator using the log_function!
macro.
This above inventive piece of code logs function names just before they spring into action. The add
function serves as the stage for this cross-linguistic performance, highlighting the extraordinary fusion of Python’s elegant simplicity and Rust’s high-octane performance within a single, harmonious codebase.
原文链接:Decorators in Rust
暂无评论内容