为什么Scala中会有RichInt或者RichX?

Why are there RichInt or RichX in Scala?

这是一个简单的问题。

为什么Int相关的方法没有驻留在Int中?
相反,Scala 费心将相关方法放入 RichInt 并依赖 隐式转换 以使它们像 [=10 的方法一样工作=].

何必呢?

问题是为什么不对 Int 进行丰富的建模,然后进行优化,例如,它具有未装箱的表示形式,并且某些操作是本机提供的?

答案肯定是编译器仍然不太擅长这些优化。

scala> 42.isWhole
res1: Boolean = true

scala> :javap -prv -
[snip]
         9: getstatic     #26                 // Field scala/runtime/RichInt$.MODULE$:Lscala/runtime/RichInt$;
        12: getstatic     #31                 // Field scala/Predef$.MODULE$:Lscala/Predef$;
        15: bipush        42
        17: invokevirtual #35                 // Method scala/Predef$.intWrapper:(I)I
        20: invokevirtual #39                 // Method scala/runtime/RichInt$.isWhole$extension:(I)Z
        23: putfield      #17                 // Field res1:Z
        26: return 

或在 -optimize

 9: getstatic     #26                 // Field scala/runtime/RichInt$.MODULE$:Lscala/runtime/RichInt$;
12: getstatic     #31                 // Field scala/Predef$.MODULE$:Lscala/Predef$;
15: astore_1      
16: bipush        42
18: invokevirtual #35                 // Method scala/runtime/RichInt$.isWhole$extension:(I)Z
21: putfield      #17                 // Field res0:Z
24: return 

Scala 不存在于真空中。它专门设计用于托管在一个生态系统/一个主要为另一种语言设计的平台上:Java 平台、.NET 平台、ECMAScript 平台,Cocoa,等等

这意味着在某些情况下必须做出妥协,以使 Scala 与宿主平台的生态系统、库和语言无缝、高效、高性能地运行。这就是为什么它有 null,为什么它有 classes(它可以只用特征,并允许特征有构造函数),为什么它有包(因为它们可以干净地映射到 Java 包或 .NET 命名空间),为什么它没有正确的尾调用,没有具体化的泛型等。这甚至是为什么它有花括号,而不是为了更容易与 Java 集成,而是为了更容易与 Java 开发人员的大脑集成。

scala.Int 是一个伪造的 class,它代表一个本机平台整数([=30= 中的原始 int,.NET 中的 System.Int32 等。 ) 是假的,除了宿主环境提供的操作之外,它真的不能有任何方法。

另一种方法是让所有操作都在 Int class 中,并让编译器知道哪些方法是本机方法,哪些不是。但那是特例,在general集中精力让"enrich-my-library"变快更有意义,这样所有程序员都能受益来自那些优化,而不是花费时间、金钱和资源进行仅适用于十二个左右 classes.

的优化