如何强制Haxe宏返回类型为Array / Iterable?

杰夫·沃德

我想编写一个返回数组(表达式)的宏-但我似乎无法说服编译器将我返回的值键入为数组。即使尝试过,我总是会收到“您无法迭代动态值”的信息:

  1. 显式键入返回为: ExprOf<Array<Whatever>>
  2. 在输出中插入类型提示

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将Iterable <interface>返回类型方法重写为Iterable <?延伸接口>返回类型方法

扩展Iterable的Haxe接口

如何实现Iterable接口?

如何比较Iterable的值

在 Iterable 上调用 ... of 和在返回 iterable 的函数上的区别?

如何从Iterable / Collection创建TreeMultimap?

如何在Scala中从Iterable声明类型?

较高种类类型的flatMap返回类型被解析为基础Iterable,而不是较高种类类型本身

不是 str 的 Iterable[str] 的 Python 类型提示

min(iterable,* [,键,默认])返回什么

在angular / typescript中将类创建为Iterable

Scala:如何通过时间戳将Iterable [T]分组为Iterable [T]

方法可以接收Array或Iterable吗?

通过在子类型上返回迭代器来实现Iterable

Iterable <Key>作为返回类型,这意味着什么?

Java泛型,实现类型为Iterable <E>的接口

如何将Stream变成Iterable?

如何修復 TypeError: 'int' object is not iterable

如何在Iterable上执行Stream函数?

如何从python 3的Iterable of generators中采样?

如何在Java中从Iterable创建集合?

如何在 spark 中操作这个 Iterable?

Iterable接口下的forEach方法是如何实现的?

如何将 PureWindowsPath 转换为 Iterable?

错误:无法从返回类型为“List<Transaction>?”的函数中返回“Iterable<Transaction>”类型的值。显示此错误

如何在Scala中为Iterable <Object>编写while()循环?

Dart 中的 Iterable.expand(Iterable Function(dynamic) f) 函数是如何工作的?

类型 'Future<Stations>' 不是类型 'Iterable<dynamic>' 的子类型

错误“_InternalLinkedHashMap<String, dynamic>”不是“Iterable<dynamic>”类型的子类型