加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

函数 – Scala中def f(x:Int)= x 1和val f =(x:Int)=> x 1

发布时间:2020-12-16 19:02:38 所属栏目:安全 来源:网络整理
导读:我是新来的 Scala,我有一个问题了解这一点.为什么同一概念有两种语法,而且它们中没有一个更有效率或更短(只是从打字的角度来看,也许它们的行为有所不同 – 这就是我所要求的). 在Go中,类似物具有实际的区别 – 您不能转发 – 分配给变量的lambda,但是您可以
我是新来的 Scala,我有一个问题了解这一点.为什么同一概念有两种语法,而且它们中没有一个更有效率或更短(只是从打字的角度来看,也许它们的行为有所不同 – 这就是我所要求的).

在Go中,类似物具有实际的区别 – 您不能转发 – 分配给变量的lambda,但是您可以从任何地方引用命名函数.如果我正确理解Scala的话,Scala会混合这两个:你可以转发引用任何变量(如果我错了,请纠正我).

请注意,这个问题不是What is the difference between “def” and “val” to define a function的重复.

我知道def在每次被引用/调用之后评估表达式,val只有一次.但是这是不同的,因为val定义中的表达式计算为一个函数.

这也不是Functions vs methods in Scala的重复.

这个问题涉及Scala的语法,并不直接询问函数和方法的区别.尽管内容中的答案可能相似,但是在本网站上清除此确切点仍然很有价值.

解决方法

有三个主要的区别(我知道):

内部代表

函数表达式(也称为匿名函数或lambdas)在生成的字节码中表示为任何“功能”特征的实例.这意味着函数表达式也是对象.另一方面,方法定义是JVM上的一流公民,并具有特殊的字节码表示.在没有分析的情况下,如何影响性能很难判断.

参考语法

对函数和方法的引用具有不同的语法.当您要将方法的引用作为参数发送给代码的其他部分时,您不能只是说foo.你必须说foo _.有了功能,你可以说foo,事情会按预期工作.语法foo _有效地将调用包装在匿名函数中的foo中.

通用支持

方法支持类型参数化,功能不行.例如,没有办法使用函数值来表示以下内容:

def identity[A](a: A): A = a

最接近的是这个,但是它丢失了类型信息:

val identity = (a: Any) => a

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读