【发布时间】:2018-04-21 15:30:00
【问题描述】:
在以下代码中:
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 的行为不同,即使它们都引用函数字面量?
【问题讨论】: