为什么这些看似等效的函数定义产生不同的结果?

时间:2016-09-27 07:56:12

标签: scala function expression

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;声明一个函数,上面的条件对我来说有点不同。请帮我理解这个区别......

1 个答案:

答案 0 :(得分:5)

even1even2确实不相同。要理解原因,这里有一个不同但等效的方法来定义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}已定义。