2

Stuff私は、トレイトを拡張することによって実行時に匿名のサブクラスを作成できるようにしたいケースクラス(名前を付けましょう)を持っています(それを呼び出しますMarker)。これは、私がやろうとしていることを示す REPL セッションのスニペットです。

scala> trait Marker
defined trait Marker

scala> case class Stuff(i: Int)
defined class Stuff

scala> val a = Stuff(1)
a: Stuff = Stuff(1)

scala> val b = new Stuff(1) with Marker
b: Stuff with Marker = Stuff(1)

aを使用してインスタンス化する方法に注意してくださいStuff.apply()。一方、bの場合は、ケース クラスのコンストラクターを呼び出しています。

私の質問は、コンストラクタコーシャを使用してケースクラスをインスタンス化していますか? ==.equals()、、 などのケース クラスによって提供される通常の利便性はすべて機能するため、そのように思われます.hashCode()。私がやっていることをBad Thing (TM)としてブランド化する何かが欠けていますか?

scala> a == b
res0: Boolean = true

scala> a.equals(b)
res1: Boolean = true

scala> a.hashCode == b.hashCode
res2: Boolean = true
4

2 に答える 2

3

Stuff.apply実装方法は次のとおりです。

object Stuff {
  def apply(i: Int): Stuff = new Stuff(i)
}

したがって、使用してもまったく害はありませんnew Stuff

于 2010-09-22T22:16:28.820 に答える
3

質問へ

コンストラクター kosher を使用してケースクラスをインスタンス化しています

答えは間違いなくイエスです。何かのようなもの

val b = new Stuff(1)

まったく問題ありません。new Stuff(1) with Markerの匿名サブクラスStuffが作成されるため、は異なります。それでも問題ないと思います。私が知っている問題は、ケース クラスが他のケース クラスから継承する場合に発生しますが、それを行っていません。しかし、私は何かに気づいていないかもしれません。

EDIT:REPLでのマッチングをテストしました:

scala> val b = new Stuff(1)
b: Stuff = Stuff(1)

scala> b match {case Stuff(x) => x}
res0: Int = 1

scala> b match {case Stuff(_) => true}
res1: Boolean = true
于 2010-09-22T20:03:50.260 に答える