Я новичок в Scala, и из того, что я понимаю, выход в Scala не похож на выход в С#, он больше похож на select.
Есть ли у Scala что-то похожее на С# yield? С# урожай отлично, потому что он очень удобен для написания итераторов.
Обновление: здесь пример псевдокода из С#, который я хотел бы реализовать в 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, он возвращает итератор, так что вызывающие могут пересекать график, используя регулярный цикл, например:
graph.BreadthFirstIterator().foreach( n => Console.WriteLine( n ) );
В С# выход - это просто синтаксический сахар, чтобы упростить запись итератора (IEnumerable<T>
в .Net, аналогично Iterable
в Java). Как итератор, его оценивают лениво.
Обновление II: Я могу ошибаться здесь, но я думаю, что вся точка урожая в С# заключается в том, что вам не нужно писать функцию более высокого порядка. Например. вы можете написать регулярный цикл или использовать метод, например 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))
.