Есть ли у Scala эквивалент C # yield?
Я новичок в Scala, и, насколько я понимаю, yield в Scala не похож на yield в C #, он больше похож на select.
Есть ли у Scala что-то похожее на выход C #? Выход 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
на Яве). Как итератор, его оценивают лениво.
Обновление II: Я могу ошибаться, но я думаю, что весь смысл yield в C # заключается в том, что вам не нужно писать функцию более высокого порядка. Например. Вы можете написать регулярный цикл или использовать такой метод, как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))
.