我想编写一个返回数组(数组的表达式)的宏 - 但我似乎无法说服编译器我的返回值将被键入为数组。我总是得到“你不能迭代动态值”,即使我已经尝试过:
- 明确输入返回值:
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 [];
}
}
最佳答案
呃哦,看起来这是在与调用相同的模块(文件)中定义宏类的副作用。将类分成单独的文件即可使其工作!
http://try-haxe.mrcdk.com/#57801
测试.hx:
class Test {
static function main() {
trace("Haxe is great!");
// Hooray, it works!
for (val in Macro.someArrayExpr()) {
trace(val);
}
}
}
宏.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"];
}
}
对此的技术解释( thanks to Juraj ):测试类正在宏上下文中键入。在这种情况下,它从宏调用宏,该宏始终为动态类型,因此会出现错误。因此,另一个解决方案是排除类 Test 被编译到宏上下文中: http://try-haxe.mrcdk.com/#1f3b2
关于macros - 如何强制 Haxe 宏返回类型为 Array/Iterable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49241957/