在定义部分功能时,我使用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
答案 0 :(得分:1)
基本上与val
和def
之间的差异基本相同:
def
每次引用时都会生成一个新的lambda(新对象)。
val
将生成一次(在定义时),每次引用都会引用同一个实例。
在这种情况下,val
更有意义,因此每次都不会创建新的lambda。
答案 1 :(得分:1)
你是对的:
每次引用函数时都会评估def
,val
只会被评估一次,每次都会使用相同的值。
部分功能也是如此。要查看行为,您可以看到此示例:
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