2016-06-30 2 views
0

Dies funktioniert ok:haxe: verschiedene Code in Verdinglichung Makro basierend auf Variablenwert

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

Aber in Wirklichkeit manchmal myArr.length == 0 und diese Zusammenstellung Fehler gibt:

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

Also ich sollte $ a {myArr} durch null oder new StringMap() ersetzen, wenn die Länge von myArr null ist, aber wie kann ich das tun?

Zur Zeit habe ich dies:

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

Aber der Code in Makro in Wirklichkeit ist größer ...

Antwort

1

Sie conditionals innen laufen Ihre Makroverdichtung mit ${}

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

Die Lösung ist sehr einfach:

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