下面来简单介绍一下如何来认识Scala method(方法) 和 functio(函数) 的区别,具体如下所示:

在我没有学习 scala 的时候,主要用 java 和 python 做日常工作开发,印象中,没有特别的刻意的去区分 method 和 function 的区别,这个关系,正如我们日常生活中,没有刻意的去区分质量和重量。但是,他们之间,的确是有所不同的,这些不同也是建立在他们之间有联系的基础之上!

1、如何定义

首先,还是引用英文原文来看看他们在定义上的区别和联系吧:

A Function Type is (roughly) a type of the form (T1, ..., Tn) => U, which is a shorthand for the trait FunctionN in the standard library. Anonymous Functions and Method Values have function types, and function types can be used as part of value, variable and function declarations and definitions. In fact, it can be part of a method type.

A Method Type is a non-value type. That means there is no value - no object, no instance - with a method type. As mentioned above, a Method Value actually has a Function Type. A method type is a def declaration - everything about a def except its body.

例子如下:

scala> def m1(x:Int) = x+3
m1: (x: Int)Int    scala> val f1 = (x: Int) => x+3
f1: Int => Int = <function1>

看到没,方法定义和函数定义是不是在scala的解析器signature上就有显示了,def m1(x: Int) = x+3就是一个简单的method的定义。signature中m1: (x: Int)Int 表示method m1有一个参数Int型参数x,返回值是Int型。

val f1 = (x: Int) => x+3则是function的定义,解析器的signature中f1: Int => Int = <function1>表示function f1的method体接受一个Int型的参数,输出结果的类型是Int型。

从上面的例子,得出一个总结:

方法是一个以def开头的带有参数列表(可以无参数列表)的一个逻辑操作块,这正如object或者class中的成员方法一样。

函数是一个赋值给一个变量(或者常量)的匿名方法(带或者不带参数列表),并且通过=>转换符号跟上逻辑代码块的一个表达式。=>转换符号后面的逻辑代码块的写法与method的body部分相同。

2、其他区别

method 可以作为一个表达式的一部分出现(调用函数并传参),但是 method(带参方法)不能作为最终的表达式(无参方法可以,但是这个就成了方法调用,因为 scala 允许无参方法调用时省略()括号),而 function 可以作为最终的表达式出现。比如:

scala> m1
<console>:12: error: missing arguments for method m1;
follow this method with `_' if you want to treat it as a partially applied functionm1^scala> f1
res1: Int => Int = <function1>

method 可以没有参数列表,参数列表也可以为空。但是 function 必须有参数列表(也可以为空)。方法名意味着方法调用,函数名只是代表函数自身:

scala> def m2 = 100;
m2: Intscala> def m3() = 1000;
m3: ()Intscala> var f2 = => 100;
<console>:1: error: illegal start of simple expression
var f2 = => 100;^scala> var f2 =()=> 100;
f2: () => Int = <function0>scala> m2
res2: Int = 100scala> m3
res3: Int = 1000scala> m3()
res4: Int = 1000scala> f2
res5: () => Int = <function0>scala> f2()
res6: Int = 100

在函数出现的地方我们可以提供一个方法。

这是因为,如果期望出现函数的地方我们提供了一个方法的话,该方法就会自动被转换成函数。该行为被称为 ETA expansion。

注意:

期望出现函数的地方,我们可以使用方法。

不期望出现函数的地方,方法并不会自动转换成函数。

在 scala 中操作符被解释称方法: 

 

  • 前缀操作符:op obj 被解释称 obj.op
  • 中缀操作符:obj1 op obj2 被解释称 obj1.op(obj2)
  • 后缀操作符:obj op 被解释称 obj.op
scala> val ml = List(1,2,3,4)
ml: List[Int] = List(1, 2, 3, 4)scala> ml.map((x)=>2*x)
res0: List[Int] = List(2, 4, 6, 8)scala> def m(x:Int) = 2*x
m: (x: Int)Intscala> ml.map(m)
res1: List[Int] = List(2, 4, 6, 8)scala> def m(x:Int) = 3*x
m: (x: Int)Intscala> ml.map(m)
res2: List[Int] = List(3, 6, 9, 12)

可以在方法名后面加一个下划线强制变成函数。

注意: 方法名与下划线之间至少有一个空格哟!

scala> def m3(x: Int): Int = x * x * x
m3: (x: Int)Intscala> val f3 = m3_
<console>:10: error: not found: value m3_val f3 = m3_^scala> val f3 = m3 _
f3: Int => Int = <function1>scala> f3(3)
res0: Int = 27

技术沙龙系列之:Scala method(方法) 和 functio(函数) 的区别相关推荐

  1. 技术沙龙系列之:Python 函数参数前面一个星号(*)和两个星号(**)的区别

    下面来谈谈Python 函数参数前面一个星号(*)和两个星号(**)的区别,这也是许多小伙伴在学习时的一个困惑,简单为大家介绍一下: 在 Python 的函数中经常能看到输入的参数前面有一个或者两个星 ...

  2. 源聚一堂 | 开源技术沙龙(深圳站)顺利举办

    12月2日,由开放原子开源基金会主办,深圳市优博讯科技股份有限公司承办的源聚一堂开源技术沙龙(深圳站)顺利举办.本次活动是「源聚一堂」开源技术沙龙系列活动的第四站,旨在普及开源理念.传播开源知识,搭建 ...

  3. 技术沙龙 | TeaTalk 带你深度探索 SDN 网络技术再创新

    越来越多的企业.行业和政府机关顺应企业数字化转型.云服务和国家政策等趋势将业务迁移上云.随着移动云的快速发展,对网络提供差异化的服务能力也提出了很多新的考验.大规模数据中心.虚拟化 SDN 网络技术及 ...

  4. 全球AI技术开放日系列之(七):走进阿里业务中台

    主题: 全球AI技术开放日系列 7(杭州站): 走进阿里业务中台 - 探索阿里电商核心链路智能技术 时间: 9月1日 12:30-17:00 报名:点击阅读原文,半价早鸟票限时优惠 内容: 全球AI技 ...

  5. 技术沙龙 | 图神经网络(GNN)最新研究进展分享

    由于深度学习在可推理和可解释性方面的局限性,结合图计算与深度学习的图神经网络 ( GNN ) 成为近期学术界和工业界研究的热点新方向之一,并在社交网络.推荐系统等领域得到了广泛的应用. 本次技术沙龙, ...

  6. 全球AI技术开放日系列5(上海站):走进爱奇艺

    主题: 全球AI技术开放日系列 5 (上海站): 走进爱奇艺 时间: 8月18日 12:30-17:00 报名:点击阅读原文,半价早鸟票限时优惠 内容: 全球AI技术开放日(系列)是AICamp 发起 ...

  7. 错过“复联4”在所不惜,迅雷链技术沙龙北京站有哪些更精彩的地方?

    整理 | 传神 出品 | 区块链大本营(blockchain_camp) 4月27日,由迅雷集团主办的"链创未来--迅雷链技术沙龙"在北京中关村创业大街车库咖啡如期举行.本期沙龙作 ...

  8. 痞子衡嵌入式:我被邀请做科锐国际旗下数科同道主办的技术沙龙嘉宾

    「数科同道」是「科锐国际」旗下的面向技术开发者的专属垂直招聘平台.<数科同道技术沙龙>是由数科同道主办的活动,每期活动邀请行业内及其他知名公司的技术专家分享来自一线的实践经验.自2022年 ...

  9. 基于矢量瓦片技术的Web电子海图优化方法

    范梦琪, 宋伟东, 郑人维, 何欢. 2021. 基于矢量瓦片技术的Web电子海图优化方法[J]. 海洋科学, 45(2): 68-75. FAN Meng-qi, SONG Wei-dong, ZH ...

最新文章

  1. asp.net源碼坊論壇上線
  2. windows2003+PHP-5.3.8+IIS6.0的安装配置
  3. 雅虎前端优化的35条军规
  4. 训练日志 2018.11.7
  5. [Angualr 2] Using FormBuilder
  6. 玩转 SpringBoot 2 快速搭建 | Spring Tool Suite篇
  7. 数据库备份恢复策略_如何根据备份策略选择和检查正确的数据库恢复模型
  8. 12 mysql性能抖动
  9. Android的logger机制分析
  10. String 和 InputStream 互转方式
  11. jquery 添加扩展方法及为选择的对象添加方法
  12. 小米max2刷android p,小米max2刷LineageOS记录
  13. 冰雪传奇刷怪计时器_冰雪传奇BOSS计时器
  14. pytorch下使用LSTM神经网络写诗
  15. multi-key map passed in for ordered parameter sort
  16. 日志库EasyLogging++学习系列(8)—— Verbose日志详解
  17. 2018-2019-2 网络对抗技术 20165322 Exp4 恶意代码分析
  18. 安装iso格式的软件安装程序
  19. 拼多多店铺数据分析有什么作用?哪些数据是有用的?
  20. 数一数你连听都没听过的古典小说有多少?

热门文章

  1. linux-deepin-GPU-CudaFFT从入门到使用三天
  2. C#中在panel上写文字并换行的方法
  3. 希望我这也能成为散文诗
  4. 买了台九号E200的车,原装电池要九千左右,自己买了20块大单体锂电和彦阳的保护板装了个60AH锂电池,比原装还大6AH,不需要改仓还能直接装到电池仓里面,支持双店模式,可以多跑个十几公里,关键装出来
  5. 直播系统(推流拉流) nginx+JavaCV+springboot
  6. Python OpenCV实现姿态识别
  7. Unity Shader的Lerp()函数
  8. ubuntu下打开pdf文件
  9. C#调用成功调用C++ dll笔记
  10. 九度oj 题目1335:闯迷宫