【发布时间】: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。但是,- 运算符未定义。除非有办法初始化<T:(Int,Float)> 类型的局部变量,否则我看不出这是如何工作的。
为了得到一个零,这可能已经是太多的工作了。当然,我的问题是如何使这种带有类型参数的函数工作。
谢谢。
-- 更新--
经过一番阅读,我了解到可以使用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) 作为零元素。
【问题讨论】: