在Scala中由Int的运算符定义混淆

zjf*_*fdu 20 scala

scala教程说,Int添加操作实际上是一种方法调用:1+1意思是1.+(1)

但是当我查看源代码时Int.scala,看起来该方法只会打印一条错误消息.任何人都可以向我解释这是如何工作的?

 def +(x: Int): Int = sys.error("stub")
Run Code Online (Sandbox Code Playgroud)

sbr*_*ges 25

Int是一个值类,与其他类有些不同.在没有进入递归定义的情况下,无法在scala中表达原始添加.例如,如果+的定义是,

def +(x: Int): Int = this + x
Run Code Online (Sandbox Code Playgroud)

然后调用+将调用+,它会调用+ ...

Scala需要将值类的方法编译为用于加/减/等的java字节代码.

编译器确实将+编译成java字节码以进行添加,但是scala库作者使用存根方法编写了Int.scala,使其成为有效的scala源文件.这些存根方法实际上从未被调用过.


Esk*_*ola 7

正如实现所说,该方法是一个存根.显然,它的实现是在编译代码时由Scala编译器提供的,因为它int + int是一个原始操作,而Scala语言本身并不具有原语 - 只有编译器知道JVM上的原语.


Dan*_*ral 7

重要的是要认识到操作符是一种与语言交互方式的方法.比如像+Int像斯卡拉任何其他方法的行为,而不是被一些由他们自己的规则玩.

但是,在实现级别,它们根本不是方法:对于JVM,只有类具有方法,并且AnyVal就JVM而言,子类不是类.不出所料,在实现层面,它们的行为大多类似于Java原语.