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

Sun*_*nny 2 expression scala function

A型:

val even1 = (x:Int)  => { println("in even1"); x % 2 == 0}
Run Code Online (Sandbox Code Playgroud)

REPL上的输出:

even1: Int => Boolean = <function1>
Run Code Online (Sandbox Code Playgroud)

B型:

val even2 : Int => Boolean  = { println("in even2");_% 2 == 0}
Run Code Online (Sandbox Code Playgroud)

REPL上的输出:

in even2
even2: Int => Boolean = <function1>
Run Code Online (Sandbox Code Playgroud)

我知道函数的'def'和'val'声明之间的区别,上面的条件对我来说有点不同.请帮我理解这个区别......

jub*_*0bs 5

even1并且even2确实不相同.要理解原因,这里有一个不同但等效的定义方法even2:

val even2 : Int => Boolean = { println("in even2"); x => x % 2 == 0 }
Run Code Online (Sandbox Code Playgroud)

现在......定义的右侧(RHS)even1是一个函数,它接受Int并返回一个包含print语句的块,后跟一个布尔表达式.

相反,在even2这种情况下,函数和块是"由内而外":右侧是包含print语句和类型函数的块Int => Boolean.

在Scala中,是一个表达式,该表达式的结果()是该块包含的最后一个表达式(如果有的话; 否则)的结果.因此,println在声明中even1,每次执行时间even1被调用,而println在声明even2中只有一次,在执行时even2被定义.