haxe:基于变量值的宏观具体内的不同代码

时间:2016-06-30 21:57:58

标签: macros haxe

这样可行:

//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的长度为零,我应该用$或者新的StringMap()替换$ a {myArr},但是我该怎么办呢?

目前我这样做了:

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

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

2 个答案:

答案 0 :(得分:1)

您可以使用${}

在宏观具体中运行条件
var newExpr = macro Foo.bar(${myArr.length == 0 ? macro null : macro $a{myArr}});

答案 1 :(得分:0)

解决方案非常简单:

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);
}