2

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 開発者にとっては、おそらく実行可能です)。

4

2 に答える 2

5

幸いなことに、Scala の Product インターフェースはすべてのケース クラスによって実装されているため、実際にはこれを行うのはそれほど難しくありません。私は Salat と呼ばれる Scala シリアライゼーション ライブラリの作成者であり、漬けられた Scala シグネチャを使用して型付きフィールド情報を取得するためのユーティリティを提供しています。

https://github.com/novus/salat - salat-util パッケージ内のいくつかのユーティリティを確認してください。

実際、これはサラットがすべきことだと思います - なんて良い考えでしょう。

Re: コンパイル時にパラメーターを検証することが不可能であるという DC Sobral のポイント - ポイントが取られましたが、実際には、JSON や Mongo DBObject など、構造に関する保証のない他のものを逆シリアル化するのと同じように、これは実行時に機能するはずです。また、Salat には、指定されたデフォルトの引数を利用するためのユーティリティがあります。

于 2012-01-05T19:54:39.427 に答える
3

すべてのパラメータがそのマップに渡されたことをコンパイル時に確認できないため、これは不可能です。

于 2012-01-05T19:59:42.420 に答える