Scala基础

一个人想着一个人 提交于 2019-12-09 20:45:22

1. 函数和方法

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

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

在Scala中无法直接操作方法,如果要操作方法,必须先将其转换成函数。有两种方法可以将方法转换成函数:

val f1 = m _

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

val f1: (Int) => Int = m

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

2. 两者的区别

可以直接调用函数上的方法,而方法却不行,例如:

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

3. Currying函数和Currying方法

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

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?
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!