Scala中Dynamic类型的实际用法

Ada*_*ung 41 types scala

除了在JVM上与动态语言集成之外,还有像Scala这样的静态类型语言中Dynamic类型的其他强大用途是什么?

eiv*_*ndw 22

我想动态类型可用于实现JRuby,Groovy或其他动态JVM语言中的一些功能,如动态元编程和method_missing.

例如,创建类似于Rails中的Active Record的动态查询,其中带有参数的方法名称在后台转换为SQL查询.这是在Ruby中使用method_missing功能.这样的事情(理论上 - 没有试图实现这样的事情):

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
  }
}
Run Code Online (Sandbox Code Playgroud)

允许这样的用法,你可以调用方法'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")
Run Code Online (Sandbox Code Playgroud)

如果要添加动态元编程,则需要动态类型以允许调用在运行时添加的方法.