【问题标题】:haxe: different code inside macro reification based on variable valuehaxe:基于变量值的宏具​​体化中的不同代码
【发布时间】:2016-06-30 21:57:57
【问题描述】:

这工作正常:

//somewhere in Foo:
static function bar(arg:StringMap<Dynamic>) {trace(arg.toString())}
...
//somewhere in build macro:
var myArr = [macro "k1"=>100, macro "k2"=>200, macro "k3"=>300];
var newExpr = macro {
    Foo.bar($a{myArr});
}

但实际上有时 myArr.length == 0 会导致编译错误:

Array<Unknown<0>> should be haxe.ds.StringMap<Dynamic>

所以如果 myArr 的长度为零,我应该将 $a{myArr} 替换为 null 或 new StringMap(),但我该怎么做呢?

目前我是这样做的:

var newExpr = myArr.length == 0 ? 
    macro {
        Foo.bar(null);
    } : macro {        
        Foo.bar($a{myArr});
    };

但实际上宏中的代码更大......

【问题讨论】:

    标签: macros haxe


    【解决方案1】:

    您可以使用 ${} 在宏具体化中运行条件

    var newExpr = macro Foo.bar(${myArr.length == 0 ? macro null : macro $a{myArr}});
    

    【讨论】:

      【解决方案2】:

      解决方法很简单:

      var myArr = [macro "k1"=>100, macro "k2"=>200, macro "k3"=>300];
      ...
      var arrExpr = myArr.length == 0 ? macro new Map<String, Dynamic>() : macro $a {myArr};
      var newExpr = macro {
          Foo.bar($arrExpr);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        相关资源
        最近更新 更多