为什么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.
的优化
这是一个简单的问题。
为什么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.