Decorators in Rust

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>: add
Result: 12
Calling <span>function</span>: add
Result: 12
Calling 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

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
May you live like a child forever.
愿你永远活的像个孩子
评论 抢沙发

请登录后发表评论

    暂无评论内容