9

デフォルト値を持つパラメータを取るクラス コンストラクタがあるとします。

class A(val p1 : Int = 3, val p2 : Int = 4) 

このクラスを制御できず、とにかく変更できないとしましょう。私がやりたいことは、p1 = 5、p2 = (条件 1 == true の場合、それ以外の場合はデフォルト値 5) で A のコンストラクターを呼び出すことです。これを行う1つの方法は

if(condition1)
  x = new A(5,5)
else
  x = new A(5)

ご覧のとおり、多くのパラメーターがあり、それぞれを条件付きで指定する必要がある場合、これは簡単に大きくなります。私が欲しいのは次のようなものです

x = new A(p1 = 5, p2 = <if condition1 = true then 5 else default>)

どうやってやるの?クラス A のフィールドは val であるため、A をインスタンス化した後に変更できないことに注意してください。

4

5 に答える 5

1

デフォルト値を取得し、

val defaultA = new A()

それで

val x = new A(p1 = 5, p2 = if (cond) 5 else defaultA.p2)
于 2015-09-22T10:27:03.217 に答える
0

これは、迅速で間違った答えです。

x = new A(p1 = 5, if (condition1) 5 else A.$lessinit$greater$default$2)

「間違った」部分は、これが 2.10 では機能するが 2.9 では機能しないことです。デフォルト メソッドのマジック名はバージョンごとに (特に 2.9 から 2.10 の間で) 変更されているため、その名前を調べてリフレクション経由で呼び出す方が安全です。リフレクションを介してデフォルトの引数を使用してケース クラスをインスタンス化する 、Scala リフレクションを介してデフォルトのパラメーター値にアクセスするにはどうすればよいですか? を参照してください。およびデフォルトの引数を使用した Scala の動的インスタンス化

于 2013-10-18T00:11:12.513 に答える