Y at-il un method_missing à scala?
-
29-09-2019 - |
Question
similaire à celui de Ruby
La solution
Ce qui suit est plus strictement vrai avec le trait Dynamic
trouve dans [expérimental] Scala 2.9. Voir la réponse de Kipton Barros, par exemple.
Cependant, Dynamic
est toujours pas tout à fait comme method_missing
, mais il utilise plutôt magique compilateur aux appels de méthode efficace réécriture à « manquantes » méthodes, tel que déterminé statiquement, à un proxy (applyDynamic
). Il est l'approche déterminant statiquement les « manquantes » des méthodes qui le différencie des method_missing
du point de vue du polymorphisme: il faudrait essayer de dynamiquement avant (par exemple avec la réflexion) méthodes pour obtenir vrai comportement method_missing
. (Bien sûr, cela peut être évité en évitant les sous-types: -)
Non. Un tel concept n'existe pas en Java ou Scala.
Comme Java, toutes les méthodes de Scala sont « liés » au moment de la compilation (ce qui détermine aussi ce que la méthode utilisée pour la surcharge, etc.). Si un programme ne compile, ledit procédé existe (ou exécutèrent le compilateur), sinon il ne fonctionne pas. Ceci est la raison pour laquelle vous pouvez obtenir le NoSuchMethodError si vous modifiez une définition de classe sans avoir à reconstruire toutes les classes concernées.
Si vous êtes inquiet au sujet d'essayer d'appeler une méthode sur un objet qui est conforme à une signature ( « typage de canard typé »), alors peut-être que vous pourriez être en mesure de sortir avec de frappe structurelle. frappe structurelle Scala est un accès magique sur la réflexion - ainsi reporter la « fixation » jusqu'à ce que l'exécution et une erreur d'exécution peut être généré. Contrairement à method_missing cela ne permet pas la cible pour gérer l'erreur, mais il ne permet à l'appelant (et l'appelant pourrait théoriquement appeler une méthode methodMissing définie sur la cible ... mais cela est probablement pas meilleure façon d'aborder Scala Scala est pas Ruby: -.)
Autres conseils
Oui , à partir de Scala 2.9 avec l'option -Xexperimental
, on peut utiliser le trait Dynamic
( scaladoc ) . Les classes qui étendent Dynamic
obtiennent la méthode magique applyDynamic(methodName, args)
qui se comporte comme le method_missing
Ruby.
Entre autres choses, le trait Dynamic
peut être utile pour l'interfaçage avec les langages de dynamiques sur la machine virtuelle Java.
Pas vraiment. Il n'a pas de sens. Scala est un langage statiquement typé dans lequel les méthodes sont liées au moment de la compilation; Ruby est un langage typé dynamiquement dans lequel messages sont transmis à des objets, et ces messages sont évalués lors de l'exécution, ce qui permet Ruby aux messages poignée qu'il ne répond pas directement à, à la method_missing
.
Vous pouvez mimétique method_missing
en quelques manières à Scala, notamment à l'aide de la bibliothèque Actors, mais il est pas tout à fait la même (ou presque aussi facile) comme method_missing
Ruby.
Non, cela est impossible à Scala 2.8 et versions antérieures.