Groovy では、次のことができます。
class Foo {
Integer a,b
}
Map map = [a:1,b:2]
def foo = new Foo(map) // map expanded, object created
ScalaはGroovyという言葉の意味ではないことを理解していますが、このコンテキストでのマップ拡張がサポートされているかどうか疑問に思っています
簡単に言えば、私は試して失敗しました:
case class Foo(a:Int, b:Int)
val map = Map("a"-> 1, "b"-> 2)
Foo(map: _*) // no dice, always applied to first property
問題の可能な解決策を示す関連スレッド。
今、私が掘り起こすことができたものから、少なくとも Scala 2.9.1 の時点では、ケース クラスに関するリフレクションは基本的にノーオペレーションです。最終的な影響は、Scala のパワーを考えると皮肉なことに、なんらかの形式の手動オブジェクト作成を強いられるように思われます。
ユース ケースには、サーブレット リクエスト パラメーター マップが関係していることに注意してください。具体的には、Lift、Play、Spray、Scalatra などを使用して、サニタイズされた params マップ (ルーティング レイヤーを介してフィルター処理) を取得し、オブジェクトを手動で作成したり、その型を指定したりすることなく、ターゲット ケース クラス インスタンスにバインドしたいと考えています。 . これには、型変換エラーを処理するために、「信頼できる」リフレクションと「str2Date」などの暗黙が必要です。
おそらく 2.10 では、新しいリフレクション ライブラリを使用して、上記を実装するのは簡単です。Scala を始めてまだ 2 か月しか経っていないので、表面をなぞっただけです。これを実現する簡単な方法は今のところ見当たりません (ベテランの Scala 開発者にとっては、おそらく実行可能です)。