Gibt es eine method_missing in scala?
-
29-09-2019 - |
Frage
ähnlich den in Ruby
Lösung
Im Folgenden ist nicht mehr ganz richtig mit dem Dynamic
Merkmal in [experimental] Scala 2.9 gefunden. Siehe die Antwort von Kipton Barros, zum Beispiel.
Allerdings Dynamic
noch ist nicht ganz wie method_missing
, sondern beschäftigt eher Compiler Magie, um effektiv Rewrite Methodenaufrufe zu "fehlenden" Methoden, wie statisch bestimmt, an einen Proxy (applyDynamic
). Es ist der Ansatz von statisch Bestimmung der „fehlenden“ Methoden, dass sie unterscheidet von method_missing
von einem Polymorphismus Sicht: man braucht, um zu versuchen und dynamisch vorwärts (zum Beispiel mit Reflexion) Methoden wahr method_missing
Verhalten zu bekommen. (Natürlich kann dies durch die Vermeidung von Unterarten vermieden werden: -)
Nein. Ein solches Konzept gibt es in Java oder Scala nicht.
Wie Java, alle Methoden in Scala sind ‚gebunden‘ bei der Kompilierung (dies bestimmt auch, welche Methode für Überlastung verwendet wird, etc). Wenn ein Programm kompilieren läßt, wobei das Verfahren existiert (oder tat nach dem Compiler), sonst funktioniert es nicht. Aus diesem Grund erhalten Sie können die NoSuchMethodError wenn Sie eine Klassendefinition ändern, um alle betroffenen Klassen ohne neu zu erstellen.
Wenn Sie sind besorgt, nur zu versuchen, eine Methode für ein Objekt aufzurufen, die Konformität mit einer Signatur ( „getippt Ente eingeben“), dann vielleicht können Sie in der Lage sein, mit wegzuzukommen Struktur Typisierung . Strukturelle Typisierung in Scala ist magisch Zugang über Reflexion - so es die aufschiebt ‚verbindlich‘ erst zur Laufzeit und ein Laufzeitfehler erzeugt werden kann. Im Gegensatz zu method_missing dies nicht dem erlaubt Ziel , um den Fehler zu behandeln, sondern ermöglicht es dem Anrufer (und die Anrufer theoretisch eine definierte methodMissing Methode auf dem Ziel nennen könnten ... aber das ist wahrscheinlich nicht die bester Weg zu nähern Scala Scala ist nicht in Ruby: -).
Andere Tipps
Ja , wie der Scala 2.9 mit der -Xexperimental
Option kann man das Dynamic
Merkmal verwenden
( scaladoc ) . Klassen, die Dynamic
erhalten die magische Methode applyDynamic(methodName, args)
welche verhält sich wie Rubys method_missing
erweitern.
Unter anderem der Dynamic
Eigenschaft kann für die Anbindung mit dynamischen Sprachen auf der JVM nützlich sein.
Nicht wirklich. Es macht keinen Sinn machen. Scala ist eine statisch typisierte Sprache, in der Methoden bei der Kompilierung gebunden sind; Ruby ist eine dynamisch typisierte Sprache, in der Nachrichten sind auf Objekte übergeben, und diese Nachrichten werden zur Laufzeit ausgewertet, die Ruby-Nachrichten Griff ermöglicht, dass es nicht direkt reagiert auf, à la method_missing
.
Sie können mimische method_missing
in ein paar Möglichkeiten in Scala, insbesondere durch die Schauspieler-Bibliothek, aber es ist nicht ganz dasselbe (oder fast so einfach) wie Rubys method_missing
.
Nein, das ist nicht möglich, in Scala 2.8 und früher.