以下def和val部分函数之间的区别

时间:2017-11-06 20:40:34

标签: scala

在定义部分功能时,我使用def还是val之间有区别吗?我认为可能def每次都会被评估(就像函数调用一样),而val只会被评估一次,但情况似乎并非如此。

scala> def add(x:Int)(y:Int) = {println("inadd");x+y}
add: (x: Int)(y: Int)Int

//def
scala> def add2ToDef= add(2) _
add2ToDef: Int => Int

//val
scala> val add2ToVal= add(2) _
add2ToVal: Int => Int = $$Lambda$1032/1413020227@512abf25

scala> add2ToDef(3)
inadd
res0: Int = 5

scala> add2ToVal(3)
inadd
res1: Int = 5

scala> add2ToDef(4)
inadd
res2: Int = 6

scala> add2ToVal(5)
inadd
res3: Int = 7

2 个答案:

答案 0 :(得分:1)

基本上与valdef之间的差异基本相同:

def每次引用时都会生成一个新的lambda(新对象)。

val将生成一次(在定义时),每次引用都会引用同一个实例。

在这种情况下,val更有意义,因此每次都不会创建新的lambda。

答案 1 :(得分:1)

你是对的: 每次引用函数时都会评估defval只会被评估一次,每次都会使用相同的值。

部分功能也是如此。要查看行为,您可以看到此示例:

scala> def add(x:Int)(y:Int) = {println("inadd");x+y}
add: (x: Int)(y: Int)Int

scala> def addWithDef = add(2)(3)
addWithDef: Int

scala> addWithDef     // Evaluated
inadd
res0: Int = 5

scala> addWithDef     // Evaluated again as "inadd" is printed again  
inadd
res1: Int = 5

scala> val addWithVal = add(2)(3)    // Evaluated once
inadd
addWithVal: Int = 5

scala> addWithVal     //Same value referenced again(no "inadd" printed)
res2: Int = 5

scala> addWithVal     //Same value referenced again(no "inadd" printed)
res3: Int = 5