AnyVal的目的是什么?

时间:2012-09-29 17:49:28

标签: scala

我无法想到类型AnyVal会有用的任何情况,特别是添加Numeric类型以便在IntLong上进行抽象,有AnyVal的实际用例,还是只是一个让类型层次更漂亮的工件?


为了澄清,我知道AnyVal 是什么,我无法想到我在Scala中实际需要它的时间。我何时需要包含IntCharacterDouble的类型?似乎只是在那里使类型层次更漂亮(即,将AnyValAnyRef作为兄弟姐妹看起来更好,而不是IntCharacter等继承直接来自Any)。

2 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:7)

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

  

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

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

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

规范继续:

  

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

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

那就是说,你必须接受@drexin的回答,因为如果你没有使用价值等级来扩展方法,那么你就不会真正生活。 (从某种意义上说,实现它。)

来自SIP的动机:

  

... Scala中的类可以完全内联,所以操作就可以了   与外部方法相比,这些类的开销为零。一些   内联类的用例是:

     
      
  1. 内联隐式包装器。那些包装上的方法就是   转换为扩展方法。
  2.   
  3. 新的数字类,例如无符号整数。不会再这样了   需要成为这类课程的拳击开销。所以这类似于   .NET中的值类。
  4.   
  5. 表示计量单位的类。再次,没有拳击开销   将会招致这些课程。
  6.   

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

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

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