【问题标题】:Properly call a generic function in Haxe 3在 Haxe 3 中正确调用泛型函数
【发布时间】:2014-01-01 16:58:57
【问题描述】:

以下函数没有任何用处,但说明了我尝试使用的语法。

@:generic public static function newPoint<T: Dynamic>(point: Point<T> = null): Point<T>
{
    if (point == null)
        point = new Point<T>();
    return point;
}

如何确定/通过 T? var pt: Point&lt;Int&gt; = newPoint&lt;Int&gt;(); 给我一个错误,与 var pt: Point&lt;Int&gt; = newPoint(); 相同

那么调用这样一个泛型函数的正确方法是什么?搜索示例数小时没有给我任何帮助 - Haxe 有时确实是一个黑匣子。

这是另一个例子:

@:generic static private function randomElement<T>(array: Array<T>, usedIndices: Map<Int, Int> = null): T
{
  var ix: Int;

  if (usedIndices != null)
  {
    do {
      ix = Math.floor(Math.random() * array.length);
    } while (usedIndices.exists(ix) == true);

    usedIndices.set(ix, 0);
  }
  else {
    ix = Math.floor(Math.random() * array.length);
  }

  return array[ix];
}

现在这对我来说完美无缺:

var elems: Array<Int> = [2, 3, 8, 7, 11, 16];
var elem: Int = randomElement(elems);

所以看起来 是自动正确确定的,尽管我不知道 如何 准确。有道理,但是精确规则是什么?

【问题讨论】:

    标签: generics syntax haxe


    【解决方案1】:

    我不确定这是真正的问题还是只是为了测试通用函数的工作原理。

    在您的示例中,假设有点奇怪。您使用 Point 的成像,这对于泛型类应该是可能的。 point.x = 5 将如何工作?那么为什么你希望 Point 是通用的,你想要什么?

    为了更好地理解通用函数的工作原理,我发现 Lambda 类是一个有用的参考。 https://github.com/HaxeFoundation/haxe/blob/development/std/Lambda.hx

    【讨论】:

    • 嗨,马克。也许这个例子不清楚;更准确地说,我有一组类,Point2i、Point2f、Point3i、Point3f 等。现在,对于相同的数据类型(例如,Point2i 和 Point3i,它们都使用整数组件),创建类层次结构很容易,但是我想要创建具有通用数据类型的单个类。偶然我复制了一个静态公共方法,在该方法中我遇到了不寻常的行为,它本身看起来有点奇怪。
    • Lambda 类是一个很好的例子,非常感谢。但是,我真正想知道的是调用语法。我编辑了这个例子,让它看起来更合理。
    猜你喜欢
    • 2010-12-19
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多