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
Respuesta
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 ..
¿No debería usar el tercer ejemplo P mayúscula: 'Person.findByName (" Bob ")'? – anishpatel
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")
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. –
Lo hice funcionar aquí: [http://stackoverflow.com/questions/14876856/simple-scala-macro] –
Odersky dice que la motivación principal fue la integración con lenguajes dinámicos: http://groups.google.com/group/scala-language/msg/884e7f9a5351c549
[editar] Martin confirma aún más este here
- 1. ¿Usos prácticos para tipos estructurales?
- 2. Usos prácticos de TypedReference
- 3. jQuery .each() - ¿Usos prácticos?
- 4. Usos prácticos de MethodRental Class?
- 5. ¿Usos prácticos de serialización de objetos?
- 6. algunos usos prácticos de mem_fn & bind
- 7. jQuery.map - ¿Usos prácticos para la función?
- 8. ¿Cuáles son los usos prácticos de un constructor protegido?
- 9. ¿Cuáles son los usos prácticos del módulo (%) en la programación?
- 10. ¿Qué hace el nuevo tipo dinámico scala?
- 11. ¿Cuáles son los usos prácticos de Factory Method Pattern?
- 12. Comportamiento explícito del constructor de copias y usos prácticos
- 13. Usos prácticos para el "Patrón de plantilla curiosamente recurrente"
- 14. Proxy dinámico sin especificar explícitamente el tipo en scala
- 15. ¿Ejemplos de usos comunes y prácticos de eventos de burbujeo y captura?
- 16. Mixin dinámico en Scala - ¿es posible?
- 17. ¿Cuáles son algunos usos prácticos para las variables const const en C?
- 18. Obtener las propiedades de un tipo dinámico
- 19. Scala campo dinámico llamada x
- 20. C#, tipo de retorno dinámico
- 21. conversiones de tipo dinámico C#
- 22. ¿Cuáles son algunos usos interesantes/prácticos para matrices con tres o más dimensiones?
- 23. Scala - objeto dinámico/clase de carga
- 24. Ejemplos prácticos de uso de NLTK
- 25. Extracción de tipo en Scala
- 26. ¿Cómo crear un tipo dinámico propio o un objeto dinámico en C#?
- 27. ¿Son prácticos Rank2Types/RankNType sin variables tipo polytype?
- 28. Scala Tipo de retorno
- 29. Limitaciones del tipo dinámico en C#
- 30. ¿Cómo declaras un alias de tipo en un constructor scala?
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. –
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