dynamictypes在Scala中的实际用法

除了在JVM上集成dynamic语言之外,在Scala这样的静态types语言中, Dynamictypes还有哪些其他强大的用途?

我想dynamictypes可以用来实现JRuby,Groovy或其他dynamicJVM语言(如dynamic元编程和method_missing)中的几个function。

例如,在Rails中创build一个类似于Active Record的dynamic查询,其中带参数的方法名称在后台被转换为SQL查询。 这是使用Ruby中的method_missingfunction。 像这样(理论上 – 没有试图实现这样的东西):

 class Person(val id: Int) extends Dynamic { def _select_(name: String) = { val sql = "select " + name + " from Person where id = " id; // run sql and return result } def _invoke_(name: String)(args: Any*) = { val Pattern = "(findBy[a-zA-Z])".r val sql = name match { case Pattern(col) => "select * from Person where " + col + "='" args(0) + "'" case ... } // run sql and return result } } 

允许像这样使用,你可以调用方法'name'和'findByName',而不必在Person类中明确定义它们:

 val person = new Person(1) // select name from Person where id = 1 val name = person.name // select * from Person where name = 'Bob' val person2 = person.findByName("Bob") 

如果要添加dynamic元编程,则需要Dynamictypes以允许调用在运行时添加的方法。

Odersky说主要动机是与dynamic语言的整合: http : //groups.google.com/group/scala-language/msg/884e7f9a5351c549

马丁在这里进一步证实了这一点

你也可以在地图上使用它作为语法糖:

 class DynamicMap[K, V] extends Dynamic { val self = scala.collection.mutable.Map[K, V]() def _select_(key: String) = self.apply(key) def _invoke_(key: String)(value: Any*) = if (value.nonEmpty) self.update(key, value(0).asInstanceOf[V]) else throw new IllegalArgumentException } val map = new DynamicMap[String, String]() map.foo("bar") // adds key "foo" with value "bar" map.foo // returns "bar" 

说实话,这只能节省你几个击键:

 val map = new Map[String, String]() map("foo") = "bar" map("foo")