3

パラメーター数 (21!!) を持つ scala ケース クラスの場合

例:case class Car(type: String, brand: String, door: Int ....) タイプ = ジープ、ブランド = トヨタ、ドア = 4 ....など

そして、名前付きパラメーターでオーバーライドできるコピーメソッドがあります: Car.copy(brand = Kia) type = jeep、brand = Kia、door = 2...などになります。

私の質問は、名前付きパラメーターを動的に提供できる方法はありますか?

def copyCar(key: String, name: String) = {
  Car.copy("key" = "name") // this is something I make up and want to see if would work
}

scala リフレクション ライブラリはここで役立つでしょうか?

コピー メソッドを使用する理由は、1 つまたは 2 つのパラメーターのみが変更されたケース クラスを作成するたびに、21 個のパラメーターの割り当てを繰り返したくないからです。

どうもありがとう!

4

4 に答える 4

0

はい、それを行うにはリフレクションを使用する必要があります。

これはcopy合成メソッドであり、置換するフィールドを除くすべてのフィールドに対して getter を呼び出す必要があるため、少し複雑です。

参考までに、このクラスの copy メソッドは、名前の代わりに引数インデックスを使用することを除いて、まさにそれを行います。コンパニオン オブジェクトのapplyメソッドを呼び出しますが、効果は同じです。

于 2013-06-28T14:56:26.130 に答える
0

ケースクラスを使用することはできません。

コンパイル時に生成されたメソッドと、コンパイル時に処理された名前付きパラメーターをコピーします。実行時にそれを行う可能性はありません。

Dynamicあなたの問題を解決するのに役立つかもしれません: http://hacking-scala.tumblr.com/post/49051516694/introduction-to-type-dynamic

于 2013-06-26T06:40:53.720 に答える
-1

私は少し混乱しています - 以下はあなたが必要としているものではないのはなぜですか?

car: Car = ...          // Retrieve an instance of Car somehow.
car.copy(type = "jeep") // Copied instance, only the type has been changed.
car.copy(door = 4)      // Copied instance, only the number of doors has changed.
// ...

初期インスタンス作成のパラメータが多いからでしょうか。その場合、デフォルト値を使用できないでしょうか?

case class Car(type: String = "Jeep", door: Int = 4, ...)

あなたはこれらの機能の両方について知っているようで、ニーズに合わないと感じています。その理由を説明していただけますか?

于 2013-06-28T15:24:02.873 に答える