毎回Pos
はOrdered[Pos]
として処理され、割り当てが行われます。 割り当てが行われる必要がある場合がいくつかあります。http://docs.scala-lang.org/overviews/core/value-classes.html#when_allocation_is_necessaryを参照してください。 <
を呼び出すような単純なものをやったときに
だから、あなたは割り当てを取得します:
val x = Pos(1)
val y = Pos(2)
x < y // x & y promoted to an actual instance (allocation)
を、関連する規則は、(上記の記事から引用)されています
値のクラスが扱われるたび実際の値クラスのインスタンスは、 および のインスタンス化されていなければなりません。このルールの別のインスタンスは、値クラスが型引数として使用される場合です。避けるために:私たちはクラスPosition$Pos
のための「新しい」オペコードの2つのインスタンスを持つUPDATEを行う見ることができるように
0: aload_0
1: iconst_1
2: invokevirtual #21 // Method Pos:(I)I
5: istore_1
6: aload_0
7: iconst_2
8: invokevirtual #21 // Method Pos:(I)I
11: istore_2
12: new #23 // class test/Position$Pos
15: dup
16: iload_1
17: invokespecial #26 // Method test/Position$Pos."<init>":(I)V
20: new #23 // class test/Position$Pos
23: dup
24: iload_2
25: invokespecial #26 // Method test/Position$Pos."<init>":(I)V
28: invokeinterface #32, 2 // InterfaceMethod scala/math/Ordered.$less:(Ljava/lang/Object;)Z
:上記のコードスニペットを分解
はこれを確認し、このようなシンプルな割り当てでは、たとえオリジナルの実装に転送するだけでも、各メソッドを手動でオーバーライドすることができます:
override def < (that: Pos): Boolean = super.<(that)
override def > (that: Pos): Boolean = super.>(that)
override def <= (that: Pos): Boolean = super.<=(that)
override def >= (that: Pos): Boolean = super.>=(that)
例でx < y
を実行すると、割り当てが削除されます。 しかし、がOrdered[Pos]
として処理される場合(Ordered[Pos]
またはOrdered[T]
のTを型パラメータとする方法に渡されたときのように)は依然としてこのままです。この特定のケースでは、あなたは依然として配分を得て、それを回避する方法はありません。
あなたは配分を避けるためにどのような方法を知っていますか? – peri4n
私の更新を確認してください。 –
ありがとう – peri4n