Scala 2.10には、クラスを拡張して指定する値クラスが導入されていますAnyVal
。値クラスには多くの制限がありますが、大きな利点の1つは、新しいクラスを作成することなくペナルティなしで拡張メソッドを使用できることです。値クラスを配列に入れるためには、単純に古いクラスと、そのクラスを最初のパラメータとする一連のメソッドです。したがって、 オーバーヘッドなしで価値クラスをどのように充実させますか?
implicit class Foo(val i: Int) extends AnyVal {
def +*(j: Int) = i + j*j
}
は(JVMは、メソッド呼び出しをインライン化したら)自分で
i + j*j
を書くよりも何より高価になることはできません何かにアンラップします。
残念ながら、値のクラスを記述するSIP-15における制限の一つは
は
- Cの基本タイプは、値クラスではないかもしれません。
あなたは(あなたが本当にそれを必要としない限り)ボクシングのオーバーヘッドなしタイプセーフな単位を提供するための方法として、たとえば、上のあなたの手を得ることができる値のクラスがある場合:
class Meter(val meters: Double) extends AnyVal {
def centimeters = meters*100.0 // No longer type-safe
def +(m: Meter) = new Meter(meters+m.meters) // Only works with Meter!
}
を
オブジェクト作成オーバーヘッドなしでMeter
を充実させる方法はありますか? SIP-15の制限により、明白になるのを防ぎます。
implicit class RichMeter(m: Meter) extends AnyVal { ... }
アプローチです。
これは、保存された冗長性 '暗黙のクラス(implicit class) 'が提供するものと直接衝突するため、SIP-15の監視のようです。値クラスが基になる型として値クラスを持つことができない理由についての詳細情報へのリンクはありますか? (コンパイラの制限、実装の複雑さなど) –
@AlexDiCarlo - 論理的には必要のない値クラスには多くの制限がありますので、実装を簡略化するために行われたと思います。 –