41 votes

Utilisations pratiques de type Dynamique en Scala

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?

22voto

eivindw Points 843

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..

6voto

IttayD Points 10490

Probablement Des Dsl. Voir http://pastie.org/1468102

4voto

Adam Rabung Points 3014

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

2voto

Knut Arne Vedaa Points 3878

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")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X