Помимо интеграции с динамическими языками на JVM, каковы другие мощные возможности использования Динамический тип на статически типизированном языке, таком как Scala
Практическое использование динамического типа в Scala
Ответ 1
Я предполагаю, что динамический тип может быть использован для реализации нескольких функций, найденных в JRuby, Groovy или других динамических JVM-языках, таких как динамическое метапрограммирование и method_missing.
Например, создавая динамический запрос, похожий на Active Record in Rails, где имя метода с параметрами переводится в 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
}
}
Разрешая использование, например, здесь, где вы можете вызывать методы "имя" и "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")
Если динамическое метапрограммирование должно было быть добавлено, вам понадобится динамический тип, чтобы можно было вызвать методы, которые были добавлены во время выполнения.
Ответ 2
Odersky говорит, что основной мотивацией была интеграция с динамическими языками: http://groups.google.com/group/scala-language/msg/884e7f9a5351c549
[edit] Мартин далее подтверждает это здесь
Ответ 3
Вы также можете использовать его для синтаксического сахара на картах:
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")