我是 Scala 的新手,据我了解,Scala 中的 yield 不像 C# 中的 yield,它更像是 select。
Scala 是否有类似于 C# 的 yield 的东西?C# 的产量很棒,因为它使编写迭代器变得非常容易。
更新:这是一个来自 C# 的伪代码示例,我希望能够在 Scala 中实现:
public class Graph<T> {
public IEnumerable<T> BreadthFirstIterator() {
List<T> currentLevel = new List<T>();
currentLevel.add(_root);
while ( currentLevel.count > 0 ) {
List<T> nextLevel = new List<T>();
foreach( var node in currentLevel ) {
yield return node;
nextLevel.addRange( node.Children );
}
currentLevel = nextLevel;
}
}
}
此代码实现了图的迭代广度优先遍历,使用yield,它返回一个迭代器,以便调用者可以使用常规for循环遍历图,例如:
graph.BreadthFirstIterator().foreach( n => Console.WriteLine( n ) );
在 C# 中,yield 只是语法糖,可以轻松编写迭代器(IEnumerable<T>
在 .Net 中,类似于Iterable
Java)。作为一个迭代器,它的评估是惰性的。
更新二:我在这里可能是错的,但我认为 C# 中 yield 的全部意义在于你不必编写更高阶的函数。例如,您可以编写一个常规的 for 循环或使用类似 /// 的方法,select
而map
不是传入一个将遍历序列的函数。filter
where
例如graph.iterator().foreach(n => println(n))
,而不是graph.iterator( n => println(n))
.
这样您就可以轻松地将它们链接起来,例如graph.iterator().map(x => x.foo).filter(y => y.bar >= 2).foreach(z => println(z))
.