当我们喜欢:
时val fIncr: (x: int) => x+1
我的理解是,我们在这里定义了一个字面的函数。Scala编译器将其编译为扩展特质函数的类,并在运行时进行实例化,并将函数值分配给FINCR。
如果我将类似函数定义为方法会发生什么:
def mIncr(x: Int) = x+1
这是太过班上的吗?
编辑:
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 and evenfunc是函数变量,我们已经为它们分配了函数文字。但是,如输出所示,当我们调用double时,println语句也将执行。但是,偶数均未执行println语句,除了定义时。corm用关键字def定义,因此其行为是预期的。
使用def,
进行操作。def mIncr(x: Int) = x+1
这是Scala中的方法。方法没有自己的身份。它总是属于班级。但是,当您使用Val进行
时val mIncr = (x: Int) => x + 1
它是Scala中的功能。功能是Scala中的一个完整对象。它有自己的身份。函数是Scala中的值。但是方法不是值。
例如,如果您写入值,它将为您提供其信息。
scala> def mIncr(x: Int) = x + 1
mIncr: (x: Int)Int
scala> val x = 4
x: Int = 4
scala> x
res0: Int = 4
scala> val inc = (x: Int) => x + 1
inc: Int => Int = <function1>
scala> inc
res1: Int => Int = <function1>
scala> mIncr
<console>:9: error: missing arguments for method mIncr;
follow this method with `_' if you want to treat it as a partially applied function
mIncr
注意,当我编写MINCR时,编译器会引发错误,因为它不是一个值。函数值用于扩展函数特征的befor Scala版本2.12,但在发布2.12版之后。他们不会创建匿名类。在这里阅读它函数可以像函数的参数一样传递。您不能使用方法。当您通过方法时,Scala编译器会在引擎盖下进行ETA扩展。ETA扩展意味着它将您的方法转换为函数值。