haxe:基于变量值的宏具体化中的不同代码
haxe: different code inside macro reification based on variable value
这工作正常:
//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 的长度为零,我应该用 null 或 new StringMap() 替换 $a{myArr},但是我该怎么做呢?
目前我是这样做的:
var newExpr = myArr.length == 0 ?
macro {
Foo.bar(null);
} : macro {
Foo.bar($a{myArr});
};
但实际上宏中的代码更大...
解决方法很简单:
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);
}
您可以 运行 在宏具体化中使用 ${}
条件
var newExpr = macro Foo.bar(${myArr.length == 0 ? macro null : macro $a{myArr}});
这工作正常:
//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 的长度为零,我应该用 null 或 new StringMap() 替换 $a{myArr},但是我该怎么做呢?
目前我是这样做的:
var newExpr = myArr.length == 0 ?
macro {
Foo.bar(null);
} : macro {
Foo.bar($a{myArr});
};
但实际上宏中的代码更大...
解决方法很简单:
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);
}
您可以 运行 在宏具体化中使用 ${}
var newExpr = macro Foo.bar(${myArr.length == 0 ? macro null : macro $a{myArr}});