A型:
val even1 = (x:Int) => { println("in even1"); x % 2 == 0}
REPL上的输出:
even1: Int => Boolean = <function1>
B型:
val even2 : Int => Boolean = { println("in even2");_% 2 == 0}
REPL上的输出:
in even2
even2: Int => Boolean = <function1>
我知道&#39; def&#39;和&#39; val&#39;声明一个函数,上面的条件对我来说有点不同。请帮我理解这个区别......
答案 0 :(得分:5)
even1
和even2
确实不相同。要理解原因,这里有一个不同但等效的方法来定义even2
:
val even2 : Int => Boolean = { println("in even2"); x => x % 2 == 0 }
现在...... even1
定义的右侧(RHS)是一个函数,它接受Int
并返回一个包含print语句的块,后跟布尔表达式。
相比之下,在even2
的情况下,函数和块是&#34;在out out&#34;:右侧是包含print语句和a的块类型为Int => Boolean
的函数。
在Scala中,块是一个表达式,该表达式的结果是该块包含的最后一个表达式(如果有的话; ()
)的结果。因此,println
中的even1
语句在每次调用even1
时执行,而println
中的even2
语句只执行一次{{1}已定义。