一个奇怪的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
那我能帮我解释下
执行结果如下:
这个还真不太好懂。应该是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初学--控制语句
在第一个例子中,你的大括号里面的东西是一个block,执行的时候先把j加了1,然后返回了一个函数,println(_, j)。第二个例子则整个是一个函数
因为那个大括号只执行了一次,把j加了一,foreach执行的是println的那个函数
val f : String => Unit = {x => println(x, 1)}; s.split(",").foreach(f)和这个等价
参考这个帖子,对楼主的理解,应该有帮助
Scala中的call-by-name与call-by-value
谢谢以上各位的回复,理解了! 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;被执行了多次
{:soso_e130:}
页:
[1]