scala 发表于 2015-3-12 21:50:23

一个奇怪的scala 语句

有如下2个foreach循环,代码基本类似

object HellWord {
def main(args: Array): Unit = {
    val s = "0,1,2,3,4"
    var j= 0
    val s1 = s.split(",").filter(_.trim.nonEmpty).foreach {
      j = j + 1
      println( _, j)
    }

    println("----")
    j = 0
    val s2 = s.split(",").filter(_.trim.nonEmpty).foreach {
      item =>
      {
          j = j + 1
          println(item, j)
      }
    }
但是运行结果
第1个j 没有变化始终是1
第2个j变化了依次递增1
那我能帮我解释下
执行结果如下:




desehawk 发表于 2015-3-12 23:48:31

这个还真不太好懂。应该是item 函数的作用。

val s = "0,1,2,3,4"
    var j= 0
    val s1 = s.split(",").filter(_.trim.nonEmpty).foreach {
      j = j + 1
      println( _, j)
    }

    println("----")
    j = 0
    val s2 = s.split(",").filter(_.trim.nonEmpty).foreach {
      item =>
      {
          j = j + 1
          println(item, j)
      }
和返回值和for循环有关系
关于for循环,楼主参考下,希望对楼主有所帮助
scala初学--控制语句


arsenduan 发表于 2015-3-13 01:10:48

在第一个例子中,你的大括号里面的东西是一个block,执行的时候先把j加了1,然后返回了一个函数,println(_, j)。第二个例子则整个是一个函数


因为那个大括号只执行了一次,把j加了一,foreach执行的是println的那个函数

jixianqiuxue 发表于 2015-3-13 01:11:19

val f : String => Unit = {x => println(x, 1)}; s.split(",").foreach(f)和这个等价

desehawk 发表于 2015-3-13 01:14:15

参考这个帖子,对楼主的理解,应该有帮助
Scala中的call-by-name与call-by-value

scala 发表于 2015-3-13 09:58:48

谢谢以上各位的回复,理解了!

xuanxufeng 发表于 2015-3-13 11:17:55

object HellWord {
def main(args: Array): Unit = {
    val s = "0,1,2,3,4"
    var j= 0
    val s1 = s.split(",").filter(_.trim.nonEmpty).foreach {
      j = j + 1
      println( _, j)
    }
这里j=j+1;只被执行了一次,后面循环调用 println( _, j),但是j始终是1
    println("----")
    j = 0
    val s2 = s.split(",").filter(_.trim.nonEmpty).foreach {
      item =>
      {
          j = j + 1
          println(item, j)
      }
    }
这里item是一个函数,j=j+1;被执行了多次



feng01301218 发表于 2015-3-14 18:02:23

{:soso_e130:}
页: [1]
查看完整版本: 一个奇怪的scala 语句