Neben der Integration mit dynamischen Sprachen auf der JVM, was sind die anderen mächtigen Verwendungen einer Dynamic type in einer statisch typisierten Sprache wie Scala?Praktische Anwendungen eines dynamischen Typs in Scala
Antwort
Ich denke, ein dynamischer Typ könnte verwendet werden, um einige der Funktionen in JRuby, Groovy oder anderen dynamischen JVM-Sprachen wie dynamisches Metaprogrammieren und method_missing zu implementieren.
Zum Beispiel Erstellen einer dynamischen Abfrage ähnlich Active Record in Rails, wo ein Methodenname mit Parametern in eine SQL-Abfrage im Hintergrund übersetzt wird. Dies verwendet die method_missing-Funktionalität in Ruby. So etwas wie diese (in der Theorie - habe nicht versucht, etwas Derartiges zu implementieren):
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
}
}
erlauben Nutzung wie dieser, wo Sie ‚Name‘ Methoden aufrufen können und ‚findByName‘, ohne sie explizit in der Klasse Person definiert ist, :
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")
Wenn dynamisches metaprogramming hinzugefügt wurde, würde der dynamische Typ Methoden zu ermöglichen, benötigt Aufruf, die während der Laufzeit hinzugefügt wurden ..
Sollten Sie das dritte Beispiel nicht verwenden, verwenden Sie das P: 'Person.findByName (" Bob ")'? – anishpatel
Man könnte es auch für syntaktischen Zucker auf Karten verwenden:
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"
Um ehrlich zu sein, dies erspart Ihnen nur ein paar Tastenanschläge aus:
val map = new Map[String, String]()
map("foo") = "bar"
map("foo")
Beachten Sie, dass dieses Beispiel aus mehreren Gründen nicht ganz funktioniert, aber ich denke nicht, dass es viel Sinn macht, dies weiter zu erforschen, bevor das Feature stabiler ist. –
Ich habe es hier funktioniert: [http://stackoverflow.com/questions/14876856/simple-scala-macro] –
Odersky sagt die primäre Motivation war die Integration mit dynamischen Sprachen: http://groups.google.com/group/scala-language/msg/884e7f9a5351c549
[Bearbeiten] Martin weiter bestätigt diese here
- 1. Häufigste Anwendungen des dynamischen C# 4.0-Typs
- 2. Praktische Anwendungen von MethodRental Class?
- 3. Was sind praktische Anwendungen eines geschützten Konstruktors?
- 4. Praktische Anwendungen von TypedReference
- 5. jQuery.get() - Praktische Anwendungen?
- 6. jQuery .each() - Praktische Anwendungen?
- 7. Standardwert des dynamischen Typs?
- 8. Serialisierung eines dynamischen Typs in der Web-API
- 9. Was sind praktische Anwendungen der schwachen Verknüpfung?
- 10. Was in Algorithmen einige praktische Anwendungen von XOR sind
- 11. Grenzen für Typ-Mitglieder innerhalb eines Typs Alias in Scala
- 12. Die Zeichenfolgendarstellung eines Typs zur Laufzeit in Scala abrufen
- 13. Ignorieren des dynamischen Typs in iOS: Eingabehilfen
- 14. Gibt es praktische Anwendungen von C++ 11 Garbage Collection ABI?
- 15. Scala Gegenstände zu sammeln eines Typs aus einer Sammlung
- 16. Fehler beim dynamischen Erstellen des Typs
- 17. Was sind einige praktische Anwendungen des ROT13-Algorithmus?
- 18. Scala und Swing GUI-Anwendungen
- 19. Abenteuer eines Webprogrammierers in Applicationland (oder, praktische Java-Hilfe benötigt)
- 20. Praktische Anwendungen für die "seltsam wiederkehrende Vorlage Muster"
- 21. Interaktion mit Schauspielern in Scala Swing-Anwendungen
- 22. (Ruby) Kompilieren von dynamischen Anwendungen für Windows?
- 23. Was ist die praktische Grenze eines Textfelds?
- 24. Praktische Verwendung von Ausdrucksbäumen
- 25. SQLAlchemy: Spalten eines Typs
- 26. Liste des anonymen Typs in Liste der dynamischen Objekte umwandeln
- 27. XML-Serialisierung eines 'Typs'
- 28. Probleme beim Registrieren eines dynamischen Typs in einem .Net Remoting-Dienst
- 29. Eine generische Methode, um die Länge eines dynamischen Arrays beliebigen Typs in C++
- 30. Warum verbietet Scala-Compiler die Deklaration eines Wildcard-Typs als Super-Typ eines Typparameters
Ohne Sprachunterstützung (z. B. "dynamisch" in C# .4), ich "sehe" nicht wirklich, was mit diesem Commit vor sich geht. Wäre interessant zu sehen, wie es passt. –
Die Antworten auf diese Frage sind extrem veraltet, für tatsächliche Antworten siehe: [Wie funktioniert Typ Dynamic und wie funktioniert es?] (Http://stackoverflow.com/q/15799811/465304) – sschaef