问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

scala中方法和函数的区别

发布网友 发布时间:2022-04-22 15:57

我来回答

1个回答

热心网友 时间:2023-10-20 20:18

Scala中既有函数也有方法,大多数情况下我们都可以不去理会他们之间的区别。但是有时候我们必须要了解他们之间的不同。

Scala中的方法跟Java的方法一样,方法是组成类的一部分。方法有名字、类型签名,有时方法上还有注解,以及方法的功能

实现代码(字节码)。

Scala中的函数是一个完整的对象。Scala中用22个特质(trait)抽象出了函数的概念。这22特质从Function1到Function22

如上图中的Function10代表的是:有10个形参,返回值为R(协变)的函数。

Scala中的函数其实就是继承了这些Trait的类的对象,如:我们通过函数字面量定义一个函数

其实上述函数的定义方式跟如下定义方式等同:

由于Function2是特质,不能直接new。上述new Function2[Int,Int,Int](){}其实是定义并实例化一个实现了Function2特质的类的对象。

apply是scala中的语法糖:对一个对象obj上调用obj(),scala编译器会转换为obj.apply();在一个类clazz上调用clazz(),scala编译器会转

换为clazz_company_obj.apply(),其中clazz_company_obj为clazz的伴生对象。

具体的差异,总结为如下几点:

1.方法不能作为单独的表达式而存在(参数为空的方法除外),而函数可以。如:

在如上的例子中,我们首先定义了一个方法m,接着有定义了一个函数f。接着我们把函数名(函数值)当作最终表达式来用,由于f本身就是

一个对象(实现了FunctionN特质的对象),所以这种使用方式是完全正确的。但是我们把方法名当成最终表达式来使用的话,就会出错。

2.函数必须要有参数列表,而方法可以没有参数列表

在如上的例子中,m1方法接受零个参数,所以可以省略参数列表。而函数不能省略参数列表

3.方法名是方法条用,而函数名只是代表函数对象本身

这个比较容易理解。因为保存函数字面量的变量(又称为函数名或者函数值)本身就是实现了FunctionN特质的类的对象,要调用对象的apply

方法,就需要使用obj()的语法。所以函数名后面加括号才是调用函数。如下:

4.在需要函数的地方,如果传递一个方法,会自动进行ETA展开(把方法转换为函数)

如果我们直接把一个方法赋值给变量会报错。如果我们指定变量的类型就是函数,那么就可以通过编译,如下:

当然我们也可以强制把一个方法转换给函数,这就用到了scala中的部分应用函数:

5.传名参数本质上是个方法

传名参数实质上是一个参数列表为空的方法,如下:

如上代码实际上定义了一个方法m1,m1的参数是个传名参数(方法)。由于对于参数为空的方法来说,方法名就是方法调用

,所以List(x,x)实际上是进行了两次方法调用。

由于List(x,x)是进行了两次方法调用,所以得到两个不同的值。

如果我们稍微修改一下函数的m1的定义,把x先缓存起来,结果就会跟以前大不一样。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
新装修怎样去除异味又快又有效,洋葱和土肥皂都试过了,都没用。 新装修的店面通风多久 新店装修通风需要多久? 新装修的店面多久多久没有异味 “新店装修后臭味能持续多长时间”_百 ... 我09年的国三柴油货车,到19年7月以后还能审吗? iebook 怎样让背景音乐从第一页开始放而不是封面开始 iebook超级精灵的背景音乐和页面插入音乐,可以分别控制吗? 用iebook做电子杂志的时候怎么从头到尾设同一首音乐 iebook支持导入多首音乐吗?可不可以对每页进行音乐设置? IEBOOK 往回翻页时上一页的背景音乐怎么样才能从头开始播放而不是接... 如何用iebook连续几页不间断播放同一首音乐? 谈谈为什么上scala? 编程语言scala有哪些特点 scala的实际应用场景有哪些 在Scala(和Java)类和类之间的区别是什么 如何录制电脑声卡播放的声音 如何录制声卡上播放的声音 我的电脑声卡工作不正常,无法播放声音,该怎么办? 声卡有噪音咋办 电脑在安装独立声卡后没有声音怎么处理? 怎么让声卡播放不同的声音? 电脑声卡出现问题,声音无法播放怎么办? 声卡不能正常播放声音 如何播放声卡输入的音频 怎样使用声卡发出声音 声卡播放声音噪音很大,音乐声音很小怎么办? 我的声卡声音很小怎么办? 梅艳芳是因为什么原因去世的? 电脑安装了声卡可还是播放不出声音怎么办啊 有高血压能不能喝柚子皮水 血糖有一点高可以吃什么水果呢 知道Scala这个品牌的人多吗? scala中的部分应用函数和偏函数的区别 网络异常通话结束网络断开是不是别人把网关了 在家用笔记本上网用宽带好还是WIFI好? 长城宽带是连网线到笔记本电脑好还是连wifi好呢 涓这个字怎么读,涓怎么念,涓怎么拼音,涓怎么组词 在家用笔记本上网用宽带好还是WIFI好? 买笔记本电脑用网线好呢还是无线网卡好? 笔记本打游戏连wifi好,还是直接插网线好 冻虾尾焯水用冷水还是热水? 龙虾尾冷水焯还是热水焯? 焯虾尾冷水下锅还是热水孩子添加辅食米糊都放啥 煮虾时,究竟是用热水煮还是冷水煮?怎样让肉质变嫩? 水煮虾用冷水还是热水 网上买的虾尾是直接吃还是需要加热? 清水煮虾是开水还是冷水 超市买的熟食虾尾怎么热? 智齿多少岁不会再长了 人到多大了不长智齿 人到多少岁智齿就不在生长了