我想编写一个返回数组(表达式)的宏-但我似乎无法说服编译器将我返回的值键入为数组。即使尝试过,我总是会收到“您无法迭代动态值”的信息:
ExprOf<Array<Whatever>>
http://try-haxe.mrcdk.com/#D7D82
import haxe.macro.Context;
import haxe.macro.Expr;
class Test {
static function main() {
trace("Haxe is great!");
// ERROR: You can't iterate on a Dynamic value
for (val in Macro.someArrayExpr()) {
trace(val);
}
}
}
class Macro
{
public static macro function someArrayExpr():ExprOf<Array<String>>
{
// Neither of these works:
// Try to insert a type hint:
// return Context.parse('([]:Array<String>)', Context.currentPos());
return macro [];
}
}
嗯,这似乎是在与调用相同的模块(文件)中定义我的Macro类的副作用。将类分成单独的文件即可使用!
http://try-haxe.mrcdk.com/#57801
Test.hx:
class Test {
static function main() {
trace("Haxe is great!");
// Hooray, it works!
for (val in Macro.someArrayExpr()) {
trace(val);
}
}
}
Macro.hx:
import haxe.macro.Context;
import haxe.macro.Expr;
//use this for macros or other classes
class Macro
{
public static macro function someArrayExpr():ExprOf<Array<String>>
{
return macro ["a", "b", "c"];
}
}
为此的技术解释(感谢Juraj):在宏上下文中键入了Test类。在这种情况下,它将从始终被键入动态的宏中调用宏,因此会出现错误。因此,另一种解决方案是将Test类排除在编译到宏上下文之外:http : //try-haxe.mrcdk.com/#1f3b2
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句