Rust宏可以设置变量并同时返回一个值吗?

时间:2018-05-06 23:43:43

标签: rust

我想创建一个宏,它将作为参数const business = this.state.business ? this.state.business : []; 。宏应将变量($var:ident, $val:expr)设置为$var的值,克隆它,然后返回克隆。这是我的尝试:

$val

它不起作用,因为macro_rules! my_macro { ($var:ident, $val:expr) => {{ let $var = $val; $var.clone() }} } fn main() { println!("{}", my_macro!(x, 5)); println!("{}", x); } 语句在块内。如果我尝试通过将let更改为{{来解决问题,则会产生语法错误。有什么方法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:5)

没有

宏不是魔术,它们只是扩展为您自己可以自己编写的单个表达式/声明/项目。没有办法编写一个“转义”它所定义范围的变量声明。

答案 1 :(得分:0)

这是不可能的,因为Rust有hygienic macros,记录为here

宏观卫生cannot be disabled currently,但可以Macros 2.0中成为:

  

[]当用户希望宏def的名称为“escape”时,实现“卫生弯曲”。

答案 2 :(得分:0)

这里有一种方法可以做到这一点......

    #[macro_export]
    macro_rules! create_var {
        ($name:ident, $val:expr) => {
            let $name = $val;
        }
    }

    fn main() {
        create_var!(test, 42);
        println!("{}",test);
    }

输出:

    42