在
Scala中,yield可以用于for循环;例如:
val ints: IndexedSeq[Int] = for(i <- 1 to 10) yield i
但是我发现yield不能用于while循环,例如喜欢:
while (resultSet.next()) yield new Row(resultSet)
为什么Scala设计得像这样?
我在Google和stackoverflow上搜索过,但找不到答案.
解决方法
因为while循环是一个java等价的while循环,’for循环’被转换为函数调用:< IndexedSeq> .map(如果你使用yield)或< IndexedSeq> .foreach(如果你不在乎)结果).
示例Scala代码:
class ForVsWhileLoop { val dummy = for(i <- 1 to 10) yield i var dummy2 = Seq.empty[Int] var i = 0 while(i <= 10) dummy2 :+= i }
编译为(scala -Xprint:parse ForVsWhileLoop.scala):
[[Syntax trees at end of parser]] // ForVsWhileLoop.scala package <empty> { class ForVsWhileLoop extends scala.AnyRef { def <init>() = { super.<init>(); () }; // *********************************************** // the 'for loop' is translated to a function call val dummy = 1.to(10).map(((i) => i)); var dummy2 = Seq.empty[Int]; var i = 0; // ******************* // classic while loop while$1(){ if (i.$less$eq(10)) { dummy2.$colon$plus$eq(i); while$1() } else () } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。