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

时间:2012-01-07 05:59:27

标签: scala

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

但是当我查看Int.scala的源代码时,似乎该方法只会打印错误消息。谁能向我解释这是如何运作的?

 def +(x: Int): Int = sys.error("stub")

3 个答案:

答案 0 :(得分:25)

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

def +(x: Int): Int = this + x

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

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:7)

重要的是要认识到运算符是一种与语言交互方式的方法。像+ Int上的内容就像Scala中的任何其他方法一样,而不是按照自己的规则播放的内容。

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