Macros 如何强制Haxe宏返回类型为Array/Iterable?
我想编写一个宏来返回一个数组(表达式)——但我似乎无法说服编译器我的返回值将被类型化为数组。我总是得到“你不能在动态值上迭代”,即使我尝试过:Macros 如何强制Haxe宏返回类型为Array/Iterable?,macros,type-inference,haxe,Macros,Type Inference,Haxe,我想编写一个宏来返回一个数组(表达式)——但我似乎无法说服编译器我的返回值将被类型化为数组。我总是得到“你不能在动态值上迭代”,即使我尝试过: 将返回显式键入为:ExprOf 导入haxe.macro.Context; 导入haxe.macro.Expr; 课堂测试{ 静态函数main(){ trace(“Haxe太棒了!”); //错误:不能对动态值进行迭代 for(宏.someArrayExpr()中的val){ 微量元素(val); } } } 类宏 { 公共静态宏函数somerrayex
ExprOf
导入haxe.macro.Context;
导入haxe.macro.Expr;
课堂测试{
静态函数main(){
trace(“Haxe太棒了!”);
//错误:不能对动态值进行迭代
for(宏.someArrayExpr()中的val){
微量元素(val);
}
}
}
类宏
{
公共静态宏函数somerrayexpr():ExprOf
{
//这两项工作都不是:
//尝试插入类型提示:
//返回Context.parse(“([]:数组)”,Context.currentPos();
返回宏[];
}
}
哦,看起来这是在调用的同一模块(文件)中定义宏类的副作用。将类分离为单独的文件使其工作
测试。hx:
class Test {
static function main() {
trace("Haxe is great!");
// Hooray, it works!
for (val in Macro.someArrayExpr()) {
trace(val);
}
}
}
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"];
}
}
Macro.hx:
class Test {
static function main() {
trace("Haxe is great!");
// Hooray, it works!
for (val in Macro.someArrayExpr()) {
trace(val);
}
}
}
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"];
}
}
导入haxe.macro.Context;
导入haxe.macro.Expr;
//用于宏或其他类
类宏
{
公共静态宏函数someArrayExpr():ExprOf):测试类是在宏上下文中键入的。在这种情况下,它从宏调用宏,而宏始终是动态键入的,因此会出现错误。因此,另一种解决方案是将类测试从编译到宏上下文中排除: