2

基になるマップを持つクラスを作成したいと考えています。変数がマップで解決されるような操作をサポートしたい。通常person("height")、マップ内のキーの高さを解決して返す apply メソッドを持つことができます。

このように解決されるフィールドをサポートしたいと考えています。ということでマップperson.heightから帰還。しかし、キーのリストは事前にわかりません。したがって、すべてのフィールドを列挙することはできません。フィールド解決のデフォルトのハンドラーを持つことは可能でしょうか?

4

1 に答える 1

11

おそらく動的型が必要です:

http://www.scala-lang.org/api/current/index.html#scala.Dynamic

Scala 2.10 での動的型の追加につながる SIP: http://docs.scala-lang.org/sips/pending/type-dynamic.html

動的なフィールド解決を使用してオブジェクトを作成できる簡単な例を次に示します。

class MapBacked(initial: (String, Any)*) extends Dynamic {

  private val fields = mutable.HashMap[String, Any](initial: _*)

  // x.field translates to x.selectDynamic(field)
  def selectDynamic(field: String): Any = fields(field)

  // x.field = value translates to x.updateDynamic(field)(value)
  def updateDynamic(field: String)(arg: Any) = { fields(field) = arg }

}

使用法:

val x = new MapBacked("a" -> 1, "b" -> 2)
println(x.a) //prints 1
x.c = 42
println(x.c) //prints 42

メソッドを定義することで、動的に解決されるメソッドを定義することもできますapplyDynamic

于 2013-10-28T09:21:00.527 に答える