Oltre all'integrazione con linguaggi dinamici sulla JVM, quali sono gli altri potenti utilizzi di uno Dynamic type in un linguaggio tipizzato in modo statico come Scala?Uso pratico di un tipo dinamico in Scala
risposta
Suppongo che un tipo dinamico possa essere utilizzato per implementare molte delle funzionalità presenti in JRuby, Groovy o altri linguaggi JVM dinamici, come metaprogrammazione dinamica e method_missing.
Ad esempio, creando una query dinamica simile a Record attivo in Rails, in cui un nome di metodo con parametri viene convertito in una query SQL in background. Questo sta utilizzando la funzionalità method_missing in Ruby. Qualcosa di simile (in teoria - non hanno cercato di implementare qualcosa di simile):
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
}
}
Permettere l'utilizzo come questo, in cui è possibile chiamare i metodi 'nome' e 'findByName' senza dover esplicitamente definite nella classe 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")
Se è stato da aggiungere metaprogrammazione dinamica, il tipo dinamico sarebbe necessaria per consentire invocare i metodi che sono stati aggiunti durante l'esecuzione ..
Nel terzo esempio non si utilizza maiuscola P: 'Person.findByName (" Bob ")'? – anishpatel
si potrebbe anche usarlo per lo zucchero sintattico sulle mappe:
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"
Per essere onesti questo si salva solo un paio di sequenze di tasti da:
val map = new Map[String, String]()
map("foo") = "bar"
map("foo")
Si noti che questo esempio non funziona per un paio di motivi, ma non penso che ci sia molto da fare esplorando ulteriormente prima che la funzione sia più stabile. –
L'ho fatto funzionare qui: [http://stackoverflow.com/questions/14876856/simple-scala-macro] –
Odersky dice che la motivazione principale è stata l'integrazione con i linguaggi dinamici: http://groups.google.com/group/scala-language/msg/884e7f9a5351c549
[modifica] Martin conferma ulteriormente questa here
- 1. Uso pratico di Android XmlResourceParser?
- 2. Uso pratico di `foldl`
- 3. Esempio pratico di metodo dinamico?
- 4. uso pratico di IdentityHashMap in Java 6
- 5. Uso pratico di @Ignore in Realm?
- 6. Uso pratico delle funzioni virtuali in C#
- 7. Uso pratico degli eventi di interfaccia
- 8. Esiste un uso pratico per un puntatore `volatile restrict`?
- 9. C'è un uso pratico della struttura "Void" in .NET
- 10. C# Tupla - Che cosa è un uso pratico di Tuple
- 11. Uso pratico dei futures? Cioè, come ucciderli?
- 12. Uso pratico della parola chiave `stackalloc`
- 13. Qualcuno può pensare a un uso pratico per XMLGregorianCalendar.getEon()?
- 14. print() restituisce sempre 1, c'è un uso pratico?
- 15. Uso varargs da Scala
- 16. Uso di reduceByKey in Apache Spark (Scala)
- 17. Uso pratico della parola chiave parziale in C#
- 18. Uso pratico per il nuovo RTTI di Delphi - Attributi, Valori
- 19. Utilizzando v Non uso di `self` Tipo
- 20. Mixin dinamico in Scala - è possibile?
- 21. Uso di neo4j con scala
- 22. Uso di util.parsing in Scala 2.11
- 23. Conformità di tipo strutturale generalizzata in Scala
- 24. Dichiarare un tipo di dati in modo dinamico in C++
- 25. Tipo di questo in Scala
- 26. Uso dinamico in C# per accedere al campo di tipo anonimo - possibile?
- 27. Estrazione di tipo in Scala
- 28. Uso dinamico di un WebProxy con script WPAD
- 29. come lanciare in modo dinamico un oggetto di tipo stringa in un oggetto di tipo T
- 30. Conversioni di tipo dinamico C#
Senza supporto lingua (ad es. 'dynamic' in C# .4), in realtà non" vedo "cosa sta succedendo con quel commit. Sarebbe interessante vedere come si adatta. –
Le risposte a questa domanda sono estremamente obsolete, per le risposte effettive si veda: [Come funziona Dynamic lavorare e come usarlo?] (Http://stackoverflow.com/q/15799811/465304) – sschaef