2011-01-17 19 views
41

Además de la integración con lenguajes dinámicos en la JVM, ¿cuáles son los otros usos potentes de un Dynamic type en un lenguaje estáticamente tipado como Scala?Usos prácticos de un tipo dinámico en Scala

+1

Sin soporte de idiomas (p. Ej. 'dynamic' en C# .4), realmente no" veo "qué está pasando con esa confirmación. Sería interesante ver cómo encaja. –

+1

Las respuestas a esta pregunta están muy desactualizadas, para respuestas reales, vea: [¿Cómo funciona Dynamic type y cómo usarlo?] (Http://stackoverflow.com/q/15799811/465304) – sschaef

Respuesta

21

Supongo que se podría utilizar un tipo dinámico para implementar varias de las funciones que se encuentran en JRuby, Groovy u otros lenguajes JVM dinámicos, como la metaprogramación dinámica y la eliminación de métodos.

Por ejemplo, crear una consulta dinámica similar a Active Record en Rails, donde un nombre de método con parámetros se traduce a una consulta SQL en segundo plano. Esto es usando la funcionalidad method_missing en Ruby. Algo como esto (en teoría - no han tratado de implementar algo así):

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

que permite el uso de este tipo, donde se puede llamar a los métodos 'nombre' y 'findByName' sin tener que definen explícitamente en la clase 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") 

Si se añadirá a metaprogramming dinámico, sería necesario el tipo dinámico para permitir la invocación de métodos que se han añadido durante el tiempo de ejecución ..

+0

¿No debería usar el tercer ejemplo P mayúscula: 'Person.findByName (" Bob ")'? – anishpatel

2

es posible que también utilizarlo para el azúcar sintáctica en los mapas:

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" 

Para ser honesto, esto sólo le ahorra un par de pulsaciones de teclas a partir de:

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

Tenga en cuenta que este ejemplo no funciona por un par de razones, pero no creo que tenga sentido seguir explorando esto antes de que la característica sea más estable. –

+0

Lo hice funcionar aquí: [http://stackoverflow.com/questions/14876856/simple-scala-macro] –

Cuestiones relacionadas