6

我想不出该类型AnyVal有用的任何情况,尤其是添加Numeric用于抽象的类型IntLong等等。是否有任何实际用例AnyVal,或者它只是使类型层次结构有点的工件更漂亮?


澄清一下,我知道是什么AnyVal 我只是想不出在 Scala 中我真正需要它的任何时候。我什么时候需要一个包含Int,Character和的类型Double?似乎它只是为了使类型层次结构更漂亮(即拥有AnyValAnyRef作为兄弟姐妹而不是直接继承自 , 等Int看起来更好)。CharacterAny

4

2 回答 2

11

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

于 2012-09-29T18:03:44.297 回答
9

让我们看录像带,呃,规范 12.2:

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

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

但我们不要假装,你当然在乎。你从来不专攻吗?

规范继续:

Scala 实现需要提供值类 Unit、Boolean、Double、Float、Long、Int、Char、Short 和 Byte(但也可以免费提供其他值)。

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

也就是说,您必须接受@drexin 的回答,因为如果您没有将值类用于扩展方法,那么您就不是真正的生活。(从某种意义上说,活下去。)

来自 SIP 的动机:

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

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

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

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

这提醒了我,我忘了问,这不是 Coursera 测验问题,是吗?

于 2012-09-29T23:57:20.330 回答