在Scala中定义函数的这三种方式之间的差异

qre*_*est 92 scala

给出了表达相同功能的三种方式f(a) := a + 1:

val f1 = (a:Int) => a + 1
def f2 = (a:Int) => a + 1
def f3:(Int => Int) = a => a + 1
Run Code Online (Sandbox Code Playgroud)

这些定义有何不同?REPL没有表明任何明显的差异:

scala> f1
res38: (Int) => Int = <function1>
scala> f2
res39: (Int) => Int = <function1>
scala> f3
res40: (Int) => Int = <function1>
Run Code Online (Sandbox Code Playgroud)

Jac*_*ack 122

在一个类中,val在初始化时def进行评估,而只在每次调用该函数时进行求值.在下面的代码中,您将看到x是在第一次使用对象时计算的,但在访问x成员时不会再次计算.相反,在实例化对象时不评估y,而是在每次访问成员时评估y.

  class A(a: Int) {
    val x = { println("x is set to something"); a }
    def y = { println("y is set to something"); a }
  }

  // Prints: x is set to something
  val a = new A(1)

  // Prints: "1"
  println(a.x)

  // Prints: "1"                               
  println(a.x)

  // Prints: "y is set to something" and "1"                                  
  println(a.y)

  // Prints: "y is set to something" and "1"                                                                                   
  println(a.y)
Run Code Online (Sandbox Code Playgroud)


mis*_*tor 112

f1 是一个取整数并返回整数的函数.

f2是一个零arity的方法,它返回一个取整数并返回一个整数的函数.(f2稍后在REPL处键入时,它将成为对方法的调用f2.)

f3和...一样f2.你只是不在那里使用类型推断.

  • @Freewind,一个函数是一个名为`apply`的方法的对象.一种方法,是一种方法. (17认同)
  • 为什么`f1`是一个`函数`而``f2`是一个`方法`? (6认同)
  • @MatthewCornell,`f2`本身不接受任何参数.它返回的函数对象. (5认同)