我正在通过Scala中的Programming工作,虽然我很想从Python的角度来看待事物,但我不想编写"Scala中的Python".
就控制流程来说,我不太清楚要做什么:在Python中,我们习惯于for x in some_iterable死亡,我们喜欢它.Scala中存在一个非常相似的构造,Odersky调用for 表达式,可能是为了将它与Java for循环区分开来.此外,foreach对于可迭代数据类型,Scala有一个属性(我想它将是一个属性,我不太了解Scala的名称).但是,foreach除了为容器中的每个项调用一个函数之外,似乎我不能做更多的工作.
这给我留下了一些问题.首先,表达式是Scala中的重要/大量使用的构造,就像它们在Python中一样;其次,我何时应该使用foreach而不是for表达式(除了在容器的每个项目上调用函数的明显情况之外)?
我希望我不是非常暧昧或过于宽泛,但我只想尝试Scala中的一些设计/语言基础(到目前为止看起来非常酷).
如何yield return使用Scala continuation 实现C#?我希望能够以Iterator相同的风格编写Scala .这篇Scala新闻帖的评论中有一个刺,但它不起作用(尝试使用Scala 2.8.0测试版).一个相关问题的答案表明这是可能的,但是虽然我已经玩了一段时间的分隔延续,但我似乎无法完全理解如何做到这一点.
我是Scala的新手,据我所知,Scala中的收益与C#中的收益不同,它更像是选择.
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
此代码实现了图的迭代广度优先遍历,使用yield,它返回一个迭代器,以便调用者可以使用常规for循环遍历图,例如:
graph.BreadthFirstIterator().foreach( n => Console.WriteLine( n ) );
Run Code Online (Sandbox Code Playgroud)
在C#中,yield只是语法糖,可以很容易地编写迭代器(IEnumerable<T>在.Net中,类似于IterableJava).作为迭代器,它的评估很懒散.
更新II:我可能在这里错了,但我认为C#中的整个收益点是你不必编写更高阶函数.例如,你可以编写一个常规for循环或使用像select/ map/ filter/ 这样的方法,where而不是传入一个函数,然后遍历序列.
如graph.iterator().foreach(n => println(n))代替graph.iterator( …