scala - 方法在语义上是否等同于 Scala 3 中的函数?
问题描述
在此处解释的Scala 2中,我们有一个实现 trait的函数类型FunctionX
和一个非值类型的方法类型。我们可以将一个方法转换为方法值,它是函数类型的一个实例,如下所示:
class Sample {
def method(x:Int) = x+1
val methodValue = method _
}
现在在 Scala 3 中,我们可以保留下划线,让它看起来更像这样:
class Sample:
def method(x:Int) = x+1
val methodValue = method
等号不是表示方法和函数值的语义等价val methodValue = method
吗?同样在 Scala 2 中,我不能在创建的方法上使用任何方法(至少在具有 Scala 版本 2.13.5 的 Scastie 中),但在 Scala 3 中,我可以这样做,表明 Scala 3 中的方法是常规对象:
scala> val s = Sample()
val s: Sample = Sample@793c2cde
scala> s.method
val res13: Int => Int = Lambda$1530/856511870@ab595e8
scala> s.methodValue
val res14: Int => Int = Sample$$Lambda$1422/1191732945@1bbbede1
scala> s.method.
!= andThen compose finalize isInstanceOf notifyAll →
## apply ensuring formatted ne synchronized
-> asInstanceOf eq getClass nn toString
== clone equals hashCode notify wait
那么 Scala 3 的函数和方法是相同还是非常相似的对象,或者至少差异已经显着减少?
解决方案
val methodValue = method中的等号不是表示方法和函数值的语义等价吗?
要理解的关键概念是将方法转换为函数的eta 扩展。Scala 3 已经自动化了这个过程,所以
m _
不再需要该语法,并且将来会弃用该语法。
因此方法和函数并不相同,但是 Scala 3 尝试在它们之间透明地转换,因此程序员不必担心区别。
推荐阅读
- python-3.x - 将图像数据类型从 uint16 转换为 uint8
- sql - 使用复合主键作为外键的问题
- reactjs - 仅在升序和降序之间进行反应表排序?
- javascript - 为什么在nest.js 中找不到参数
- javascript - 我可以使用带有打字稿类的反应钩子吗?(不是 React 类,而是经典的 util typescript 类?)
- git - Git命令提取具有特定日期范围和路径的文件
- titanium - 将应用程序从 Titan sdk 3.4.0.GA 更新到 9.2.0.GA 使我的字体看起来非常小
- javascript - 我在 ubuntu 中学习 js,但是当我给出节点 index.js 的 cmd 时,它将进入新行并忽略第一个 cmd
- arrays - C中数组中的内存分配
- c# - Xamarin.Forms 页面底部到顶部动画