如何在Scala中进行默认方法处理

Aru*_*run 2 scala

我想创建一个具有底层地图的类.我想支持操作,以便在地图中解析变量.通常我们可以拥有person("height")并使用apply方法来解析地图中的键高并返回它.

我想以这种方式支持要解决的领域.所以person.height从地图返回.但事先并不知道密钥列表.所以我们不能列举所有领域.是否可以使用字段分辨率的默认处理程序?

Mar*_*ila 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 }

}
Run Code Online (Sandbox Code Playgroud)

用法:

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

您还可以通过定义方法来定义动态解析的applyDynamic方法.