6

特に、、などを抽象化するためAnyValの型を追加すると、型が役立つ状況は考えられません。実際のユースケースはありますか、それとも型階層を少し作るアーティファクトですか?もっときれい?NumericIntLongAnyVal


明確にするために、私は何AnyVal であるかを知っています、私はScalaで実際にそれを必要とするときはいつでも考えることができません。Int、、Characterを含むタイプが必要になるのはいつDoubleですか?タイプ階層をより美しくするためだけにあるようです(つまり、、などを直接継承するよりもAnyValAnyRef兄弟として持つ方が見栄えがします)。IntCharacterAny

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. unsigned int などの新しい数値クラス。そのようなクラスのボクシング オーバーヘッドはもはや必要ありません。したがって、これは .NET の値クラスに似ています。
  3. 測定単位を表すクラス。繰り返しますが、これらのクラスではボクシング オーバーヘッドは発生しません。

拡張メソッド自体を @inline としてマークすると、すべてがインライン化されます。オブジェクト ラッパーがなく、小さなメソッドがインライン化されます。

私は毎日この機能を使用しています。昨日、私はそれにバグを見つけました。バグはすでに修正されています。つまり、これは非常に優れた機能であり、Scala 関係者は、Coursera から時間をかけてバグを修正するでしょう。

そういえば、聞くのを忘れていましたが、これは Coursera のクイズの質問ではありませんよね?

于 2012-09-29T23:57:20.330 に答える