我经常读到,在迭代器上调用Lambda函数是不可能的。直到现在,我仍然坚信这种信念。然而,阅读由Franco Ponticelli和Lee-McColl-Sylvester撰写的专业Haxe关于什么使得Iterable或迭代器成为可能或者迭代器的原因让我想到了一个技巧,这看起来似乎有效;至少在我刚测试的简单情况下。Iterator上的Lambda迭代(不是可迭代的)
诀窍很简单,就是声明一个迭代()函数内的迭代器类,返回本身(奇怪的是,但不是语无伦次)。
我不知道这是否会在一般情况下工作,但这个简单的例子编译和两个HAXE 2和3 HAXE工作正常(http://try.haxe.org/#b764F):
using Lambda;
class IntIter2 {
var min : Int;
var max : Int;
public inline function new(min : Int, max : Int) {
this.min = min;
this.max = max;
}
public inline function hasNext() { return min < max; }
public inline function next() { return min++; }
// here goes the magic/weirdness/abomination
public function iterator():IntIter2 { return this; }
}
class Test {
public static function main() {
var evenNumbers = new IntIter2(3, 10)
.filter(function (n:Int):Bool return n % 2 == 0)
.list() // unneeded, in fact...
;
trace(evenNumbers.toString());
// list even numbers in the series, ie {4, 6, 8}
}
}
为什么它的工作原理(至少在这里)
“在haXe的标准库,两个非常常用的typedef定义:迭代器和可迭代
它们的定义如下:
typedef Iterator<T> = {
function hasNext() : Bool;
function next() : T;
}
typedef Iterable<T> = {
function iterator() : Iterator<T>;
}
“ - HAXE专业佛朗哥Ponticelli和Lee-麦科尔-西尔威斯特
因此增加迭代器()到一个Iterator类使得它可迭代,可使用的与lambda函数。还是那么简单?
**编辑**:我的测试表明,它甚至更复杂的情况(模板化的迭代类在模板类继承他人等)的作品。只要确保编写'function iterator():NameOfTheClass {}'而不是'function iterator():Iterator {}',你会没事的(否则在第二种情况下它会抱怨迭代器没有'Lambda。过滤器“或其他任何你尝试使用的同态方法)。 –
2014-09-03 19:40:58