为什么Scala无法将函数名称直接传递给val?

时间:2019-06-13 02:21:31

标签: scala

我有这个Scala代码:

object C extends App{
 def sum(a:Int,b:Int,c:Int)=a+b+c

 //val d=sum
 val d=sum _
 println(d(1,2,3))
}

我必须写总和_,而不是总和

但是在f#中,我可以这样写:

let sum a b c=a+b+c

let d=sum

[<EntryPoint>]
let main argv = 
 printfn "%A" (d 1 2 3)

 0 // return an integer exit code

为什么在Scala中我不能只写

val d=sum

1 个答案:

答案 0 :(得分:3)

Scala有

  • 方法(默认情况下,def是一种方法)和
  • 功能

他们不一样。

以Java方法为例,您不能在不评估方法的情况下将方法分配给变量。但是您可以使用function来实现,并在scala中实现将sum定义为function。

scala> def sum: (Int, Int, Int) => Int = (a, b, c) => a + b + c
sum: (Int, Int, Int) => Int

scala> val sumVal = sum
sumVal: (Int, Int, Int) => Int = $$Lambda$912/0x0000000801667840@716f94c1

scala> sumVal(1, 2, 3)
res1: Int = 6

定义函数的长版本为

scala>   def sum = new Function3[Int, Int, Int, Int] {
     |     def apply(a: Int, b: Int, c: Int): Int = a +b + c
     |   }
sum: (Int, Int, Int) => Int

scala> val sumVal = sum
sumVal: (Int, Int, Int) => Int = <function3>

scala> sumVal(1, 2, 3)
res2: Int = 6