这样可行:
//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});
};
但实际上宏中的代码更大......
答案 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);
}