Question

similaire à celui de Ruby

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top