函数 – Scala中def f(x:Int)= x 1和val f =(x:Int)=> x 1
我是新来的
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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- unix – 每行打印一个单词
- angularjs – 更改$ionicHistory.backView()的stateParams之
- angular中的异常机制与异常之外的处理
- bash – 使用POSIX Shell将CamelCase转换为lowerCamelCase
- 如何在(私有)Docker注册表(API v2)中查找图像的创建日期?
- scala – Scodec组合器:标头包含用于区分类型的幻数
- activiti designer源码的研究(四) 之servicetask调用webser
- yum [Errno 256] No more mirrors to try 解决方法
- 带按钮的AngularJS ng-repeat列表:单击后禁用按钮
- 更改BootStrap popover的默认样式及popover简单用法