前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Scala基础 - 函数和方法的区别

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

作者头像
joymufeng
发布2018-05-17 15:44:48
1.3K0
发布2018-05-17 15:44:48
举报

1. 函数和方法

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

代码语言:javascript
复制
class Test{
  def m(x: Int) = x + 3
  val f = (x: Int) => x + 3
}

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

代码语言:javascript
复制
val f1 = m _

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

代码语言:javascript
复制
val f1: (Int) => Int = m

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

2. 两者的区别

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

代码语言:javascript
复制
f.toString //编译通过
m.toString //编译失败

3. Currying函数和Currying方法

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

代码语言:javascript
复制
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?
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 函数和方法
  • 2. 两者的区别
  • 3. Currying函数和Currying方法
  • 4. 参考文档:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档