我知道要成为Traversable,你只需要有一个foreach方法。Iterable需要iterator方法。
Scala2.8的集合SID和“用类型对抗Bitrot”这篇论文在为什么添加Traversable这个问题上基本上都保持沉默。SID只写着"David McIver……提议的可遍历作为迭代的泛化。“
我从IRC的讨论中模糊地了解到,当遍历集合终止时,它与回收资源有关吗?
下面的问题可能与我的问题有关。TraversableLike.scala中有一些看起来很奇怪的函数定义,例如:
def isEmpty: Boolean = {
var result = true
breakable {
for (x <- this) {
result = false
break
}
}
result
}我假设有一个很好的理由,而不是仅仅写成:
def isEmpty: Boolean = {
for (x <- this)
return false
true
}发布于 2010-04-17 03:58:46
我在IRC上向David McIver询问了这个问题。他说,他不再记得所有的原因,但包括:
implement"
发布于 2010-04-09 04:42:52
我怀疑其中一个原因是,与使用抽象的iterator方法相比,使用抽象的foreach方法为集合编写具体的实现要容易得多。例如,在C#中,您可以编写实现IEnumerable<T>的GetEnumerator方法,就好像它是一个foreach方法:
IEnumerator<T> GetEnumerator()
{
yield return t1;
yield return t2;
yield return t3;
}(编译器生成一个适当的状态机,以通过IEnumerator驱动迭代。)在Scala中,您必须编写自己的Iterator[T]实现才能做到这一点。对于Traversable,您可以执行与上述实现等效的操作:
def foreach[U](f: A => U): Unit = {
f(t1); f(t2); f(t3)
}发布于 2010-06-04 22:28:42
关于你的最后一个问题:
def isEmpty: Boolean = {
for (x <- this)
return false
true
}编译器将其粗略地翻译为:
def isEmpty: Boolean = {
this.foreach(x => return false)
true
}所以你根本不能脱离foreach,isEmpty将总是返回true。
这就是为什么构造"hacky“Breakable的原因,它通过抛出一个控制异常,在breakable中捕获它并返回,从而打破了foreach。
https://stackoverflow.com/questions/2602379
复制相似问题