AnyVal的目的是什么?

Dao*_*Wen 4 scala

我想不出任何情况下的类型AnyVal将是有益的,特别是与另外的Numeric类型抽象了Int,Long等有没有实际使用情况AnyVal,或只是一种假象,使类型层次位更漂亮?


只是为了澄清,我知道什么AnyVal ,我不能想到我会真的需要它在Scala中的任何时间.当我会永远需要一个类型涵盖Int,CharacterDouble?现在看来似乎只是存在使类型层次漂亮(即它看上去有更好AnyValAnyRef兄弟姐妹,而不是Int,Character等直接继承Any).

dre*_*xin 9

正如om-nom-nom已经说过的那样,AnyVal是scala中所有原语的常见超类型.然而,在scala 2.10中,将会有一个名为的新功能value classes.值类是可以内联的类,这样可以减少扩展我的库模式的开销,因为不会有包含这些方法的包装类的实例,而是静态调用它们.您可以在SIP-15中阅读有关值类的所有内容.

  • 为了全面,`AnyVal`是层次结构中的"兄弟",它是`AnyRef`,它将是Scala中所有非原语的常见超类型.`Any`是`AnyVal`和`AnyRef`的父级,因此Scala中的所有类型都继承自`Any`,允许你执行以下操作:`val anyList:List [Any] = List(1,"Hello") ,新{def foo = 3})` (2认同)

som*_*ytt 7

我们去录像带,呃,规范12.2:

值类是其实例未由底层主机系统表示为对象的类.所有值类都继承自AnyVal类.

所以,也许问题是,如果一切都是一个对象,为什么我不关心某些东西是否被表示,即实现为一个对象?这是实现细节中的实现.

但是,我们不要假装,当然你关心.你从不专攻吗?

规范继续:

Scala实现需要提供值类Unit,Boolean,Double,Float,Long,Int,Char,Short和Byte(但也可以自由提供其他类).

因此,除了所需值类的枚举之外,对AnyVal的测试是有意义的.

也就是说,你必须接受@ drexin的答案,因为如果你没有使用值类进行扩展方法,那么你就不会真正生活.(从某种意义上讲,生活起来.)

SIP的动机:

... Scala中的类可以完全内联,因此与外部方法相比,对这些类的操作没有任何开销.内联类的一些用例是:

  1. 内联隐式包装器.这些包装器上的方法将被转换为扩展方法.
  2. 新的数字类,例如无符号整数.这些类不再需要拳击开销.所以这类似于.NET中的值类.
  3. 代表计量单位的类.同样,这些类不会产生拳击开销.

您可以将扩展方法本身标记为@inline,并且所有内容都是内联的:没有对象包装器,并且您的小方法是内联的.

我每天都使用这个功能.昨天我遇到了一个bug.该错误已经修复.这就是说它是一个很酷的功能,Scala人会从Coursera中抽出时间来消除它中的一个小错误.

这让我想起,我忘了问,这不是Coursera测验问题,是吗?