【问题标题】:how to initiate a generic variable to zero in haxe如何在haxe中将通用变量初始化为零
【发布时间】:2013-12-27 04:59:20
【问题描述】:

我正在尝试在 Haxe3.01 中编写一个通用函数,用于对数字数组求和,如下所示:

static public function sum<T:(Int,Float)>(xs:Array<T>):T {
    var z:T = 0;  //! not OK        
    for (i in 0...xs.length)
        z = z + xs[i];      
    return z;
}

上面不会编译,haxe 说... : Int should be sum.T,即使在 T 的类型约束中为 Int 和 Float 定义了 0。然后我尝试通过尝试为T 型。一个版本是:

@:generic static public function zero<T:(Int,Float)>):T {
    var x:T; //! not OK
    return x - x;
}

这个不会编译,因为zero() 中的x 没有初始化。为了初始化它,我需要一些如何在 T 的类型约束中指定它有一个新的运算符。也许,我可以使用

@:generic static public function zero<T:{function new():Void;}>():T {
    var x:T = new T();
    return x - x; //! not OK
}

,关注http://haxe.org/manual/haxe3/features。但是,- 运算符未定义。除非有办法初始化&lt;T:(Int,Float)&gt; 类型的局部变量,否则我看不出这是如何工作的。

为了得到一个零,这可能已经是太多的工作了。当然,我的问题是如何使这种带有类型参数的函数工作。

谢谢。

-- 更新--

经过一番阅读,我了解到可以使用cast

static public function sum<T:(Int,Float)>(xs:Array<T>):T {
    var z:T = cast(0);
    for (i in 0...xs.length)
        z = z + xs[i];      
    return z;   }

这感觉就像一个黑客。此外,它不会工作,例如如果 sum 用于潜在的“Pair”类型,该类型定义 - 并将 (0,0) 作为零元素。

【问题讨论】:

    标签: haxe generic-programming


    【解决方案1】:

    整数可以隐式转换为浮点数。您可以删除 Int 约束,只使用 Float。

    另请参阅:haxe "should be int" error

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多