4

モデル オブジェクトのセットとラッパー オブジェクトのセットを用意して、追加機能を提供します。

モデル オブジェクトのコレクションをラッパー オブジェクトに簡潔に変換できるようにしたいと考えていますList("x", "y", "z").foreach(println)

class Model
class ModelWrapper(val m: Model)
object ModelWrapper { def apply(model: Model) = new ModelWrapper(model) }

val m1 = new Model; val m2 = new Model; val m3 = new Model

List(m1, m2, m3).map(ModelWrapper)

そのModelWrapperため、引数として渡された はModelWrapper(_)、コンパニオン オブジェクトの呼び出しである に変換されます。

ただし、これを試すと、次のようなタイプの不一致エラーが発生します。

<console>:14: error: type mismatch;
 found   : ModelWrapper.type (with underlying type object ModelWrapper)
 required: Model => ?
                  List(m1, m2, m3).map(ModelWrapper)

ただし、 を作成ModelWrappercase classてコンパニオン オブジェクトを削除すると、機能します。追加する動作が、ケース クラスが機能する全体的な方法にうまく適合しないため、ケース クラスにしたくありません。たとえば、パラメーターとして同じモデル クラスを持つ 2 つのラッパー クラスは、必ずしも等しいとは限りません。

私が知りたいのは、この場合のケース クラスとコンパニオン オブジェクトの違いは何ですか? ケースクラスを使わずに欲しいものを手に入れることはできますか?

4

2 に答える 2

10

コンパニオン オブジェクトは関数でなければなりません。

object ModelWrapper extends Function1[Model, ModelWrapper] { def apply(model: Model) = new ModelWrapper(model) }

または、次の略語を好むかもしれません。

object ModelWrapper extends (Model => ModelWrapper) { def apply(model: Model) = new ModelWrapper(model) }
于 2012-03-13T12:09:09.447 に答える
4

何らかの理由で、これらは機能します:

  List(m1, m2, m3).map(ModelWrapper(_))
  List(m1, m2, m3).map(ModelWrapper.apply)

コンパニオンオブジェクトはあなたではなくコンパイラによって作成されるため、ケースクラスのようですModelWrapper.apply。仲間がいる場合は、仲間のことを指していると思います。

于 2012-03-13T12:58:33.920 に答える