Scala基础 - 函数和方法的区别

1. 函数和方法

在Scala中函数是一等公民,你能够像操做数字同样将函数赋值给一个变量。使用val语句能够定义函数,def语句定义方法:html

class Test{
  def m(x: Int) = x + 3
  val f = (x: Int) => x + 3
}

在Scala中没法直接操做方法,若是要操做方法,必须先将其转换成函数。有两种方法能够将方法转换成函数:app

val f1 = m _

在方法名称m后面紧跟一个空格和下划线告诉编译器将方法m转换成函数,而不是要调用这个方法。 也能够显示地告诉编译器须要将方法转换成函数:函数

val f1: (Int) => Int = m

一般状况下编译器会自动将方法转换成函数,例如在一个应该传入函数参数的地方传入了一个方法,编译器会自动将传入的方法转换成函数。scala

2. 二者的区别

能够直接调用函数上的方法,而方法却不行,例如:code

f.toString //编译经过
m.toString //编译失败

3. Currying函数和Currying方法

Currying函数能够只传入部分参数返回一个偏函数(partially applied function, 也叫部分应用函数),而Currying方法在转换成偏函数时须要加上显式说明,让编译器完成转换:htm

object TestCurrying {

  def invoke(f: Int => Int => Int): Int = {
    f(1)(2)
  }

  def multiply(x: Int)(y: Int): Int = x * y

  def main(args: Array[String]) {
    invoke(multiply)//编译器会自动将multiply方法转换成函数

    val partial1 = multiply(1) //尝试将Currying方法转换成偏函数致使编译失败
    val partial2 = multiply(1): (Int => Int) //编译经过

    val f        = multiply _  //将multiply方法转换成函数f
    val partial3 = f(1)        //只应用第1个参数返回偏函数,编译经过
  }
}

4. 参考文档:

  1. Scala Functions vs Methods
  2. Why does it compile successfully while pass only one parameter to currying function?
相关文章
相关标签/搜索