使用val在Scala中的函数文字

时间:2018-04-21 06:36:18

标签: scala function

在以下代码中:

scala> val double = (i: Int) => {
|     println("I am here")
|     i * 2
|   }
double: Int => Int = $$Lambda$1090/773348080@6ae9b2f0

scala> double(4)
I am here
res22: Int = 8

scala> val evenFunc: (Int => Boolean) = {
|                   println("I am here");
|                    (x => x % 2 == 0)
|              }
I am here
evenFunc: Int => Boolean = $$Lambda$1091/373581540@a7c489a

scala> double
res23: Int => Int = $$Lambda$1090/773348080@6ae9b2f0

scala> evenFunc
res24: Int => Boolean = $$Lambda$1091/373581540@a7c489a

scala> evenFunc(10)
res25: Boolean = true

scala> def incr(x:Int) = x+1
incr: (x: Int)Int

scala> incr
<console>:13: error: missing argument list for method incr
Unapplied methods are only converted to functions when a function type is 
expected.
You can make this conversion explicit by writing `incr _` or `incr(_)` 
instead of `incr`.
incr

double和evenFunc是函数变量,我们已经为它们分配了函数文字。但是当输出显示时,当我们调用double时,也会执行println语句。但是,当定义时,evenFunc不执行println语句。 incr使用关键字def定义,因此其行为符合预期。

为什么double和evenFunc的行为不同,即使两者都引用函数文字?

2 个答案:

答案 0 :(得分:3)

接收输入参数的点是枢轴。

如果您从...更改evenFunc

println("I am here")
x => x % 2 == 0

...到......

x =>
println("I am here")
x % 2 == 0

...您将获得与double观察到的相同的行为。

在定义函数的地方评估/执行收到的参数之前的内容。每次调用函数时都会执行收到的参数后的内容。

答案 1 :(得分:2)

差异很明显

(i: Int) => {
     println("I am here")
     i * 2
 }

{
   println("I am here");
   (x => x % 2 == 0)
}

函数文字定义为(param list) => body。因此,第二个中的println语句在函数文字之前和之后进行计算,因此它不是函数体的一部分。