加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么yield无法在scala中使用while循环

发布时间:2020-12-16 18:20:45 所属栏目:安全 来源:网络整理
导读:在 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上
在 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
        ()
    }
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读