在Haxe 3中正确调用泛型函数

时间:2014-01-01 16:58:57

标签: generics syntax haxe

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

@: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<Int> = newPoint<Int>();给了我一个错误,与var pt: Point<Int> = 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);

所以它看起来像&lt; T&gt;是自动确定的,虽然我不完全知道如何。它有意义,但精确规则是什么?

1 个答案:

答案 0 :(得分:0)

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

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

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