文档章节

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

joymufeng
 joymufeng
发布于 2016/04/04 15:52
字数 515
阅读 1009
收藏 1

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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?

© 著作权归作者所有

joymufeng

joymufeng

粉丝 115
博文 75
码字总数 75396
作品 2
南京
架构师
私信 提问
Scala学习笔记 - 函数

Scala学习笔记 - 函数 OneCoder2016-09-2157 阅读 Scala Scala做为支持函数式编程的语言,函数自然是其核心的特性,因此笔者对函数部分的学习自然会更加认真细致一些。但也仅仅是基础部分。 ...

OneCoder
2016/09/21
0
0
Scala基础 - 柯里化(Currying)及其应用

介绍 柯里化(currying, 以逻辑学家Haskell Brooks Curry的名字命名)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数作为参数的函数。在...

joymufeng
2016/04/04
1K
0
Scala学习笔记-基础语法

Scala学习笔记-基础语法 OneCoder2016-09-2046 阅读 Scala 上手学习Scala语言。先熟悉一下语法。对于Scala笔者也是完全的新手,对scala的设计思想和实现原理没有太多了解。错误在所难免,还望...

OneCoder
2016/09/20
0
0
case class 和class的区别以及构造器参数辨析

工作中偶然发现Scala构造方法中的参数,无论是否有val/var修饰都可以顺利编译运行,如下: 1 class AA(name: String)2 class BB(val name: String) 那么两者的区别在哪里呢?对于case class呢...

PerKins.Zhu
2018/07/13
0
0
第一类对象(First-class Object)

In programming language design, a first-class citizen (also object, entity, or value) in a given programming language is an entity which supports all the operations generally av......

Barudisshu
2015/04/14
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

一篇文章教你轻松使用fastjson

前言 只有光头才能变强。 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y JSON相信大家对他也不陌生了,前后端交互中常常就以JSON来进行数据交换。而有的...

Java3y
30分钟前
4
1
分组功能(tapply,by,aggregate)和* apply系列

每当我想在R中做“ map” py任务时,我通常都会尝试在apply系列中使用一个函数。 但是,我从未完全理解它们之间的区别-{ sapply , lapply等}如何将函数应用于输入/分组输入,输出将是什么样...

javail
30分钟前
4
0
PHP环境搭建之单独安装

还在使用PHP集成环境吗?教你自定义搭建配置PHP开发环境,按照需求进行安装,安装的版本可以自己选择,灵活性更大。 目录: 1. 安装Apache 2. 安装PHP 3. 安装MySQL 4. 安装Composer 观看:h...

不冷的大叔
42分钟前
4
0
为什么JavaScript变量会以美元符号开头?

我经常看到JavaScript带有以美元符号开头的变量。 您何时/为什么选择以这种方式为变量添加前缀? (我不是在问您在jQuery和其他语言中看到的$('p.foo')语法,而是普通变量,例如$name和$orde...

技术盛宴
46分钟前
4
0
TCP 三次握手

https://my.oschina.net/u/4198159/blog/3141874

奋斗的小牛
55分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部