Non seulement l'intégration avec les langages dynamiques sur la JVM, ce sont les autres puissante utilise de type Dynamique dans un langage statiquement typé comme Scala?
Réponses
Trop de publicités?Je suppose une dynamique de type peut être utilisé pour mettre en œuvre plusieurs des caractéristiques qui se retrouvent dans JRuby, Groovy ou d'autres dynamiques de la JVM langues, comme la dynamique de la métaprogrammation et method_missing.
Par exemple, la création d'une requête dynamique similaire à l'Enregistrement Actif dans les Rails, où un nom de méthode avec des paramètres est traduite en une requête SQL dans l'arrière-plan. C'est à l'aide de la method_missing fonctionnalité en Ruby. Quelque chose comme ceci (en théorie, n'ont pas essayé de mettre en œuvre quelque chose comme cela):
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
}
}
Permettant l'utilisation de ce genre, où vous pouvez appeler les méthodes de " nom " et "findByName", sans avoir explicitement définie dans la classe Personne:
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")
Si dynamique la métaprogrammation devait être ajouté, le type Dynamique sera nécessaire pour permettre à invoquer des méthodes qui ont été ajoutés au cours de l'exécution..
Probablement Des Dsl. Voir http://pastie.org/1468102
Odersky, dit la principale motivation était d'intégration avec des langages dynamiques: http://groups.google.com/group/scala-language/msg/884e7f9a5351c549
[edit] Martin confirme en outre cette ici
Vous pouvez également l'utiliser pour le sucre syntaxique sur les cartes:
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"
Pour être honnête, cela vous fait gagner un couple de touches à partir de:
val map = new Map[String, String]()
map("foo") = "bar"
map("foo")