Question

Je n'ai pas beaucoup d'expérience avec les langues (actuellement tapées statiquement apprentissage Scala et l'aimer!), Mais une chose que j'ai remarqué est qu'ils ne semblent jamais avoir quoi que ce soit comme le method_missing ou onMissingMethod de ColdFusion Ruby. Y at-il une certaine limitation inhérente aux langues statiquement typé qui empêchent ou rendent ce difficile?

Était-ce utile?

La solution

Certes, un mécanisme pour les manipuler pourrait être ajouté, mais il est en contradiction avec ce typage statique est:. Détermination Compile-temps que votre programme est exempt d'erreurs de type

Addendum

Scala 2.9 introduit une option expérimentale permettant ce genre de manipulation dynamique des accès à des types de moyens qui seraient autrement échouer la vérification de type statique. Il a été affiné et rendu non expérimental 2.10, mais il est toujours contrôlé par un indicateur de fonction par défaut autobloquantes. Vous pouvez lire à ce sujet dans le document SIP 17 . Voir SIP 18 pour une explication de Scala 2.10 de "modularisation" et des drapeaux de fonction.

Autres conseils

La version Scala 2.9 introduit cette fonctionnalité par le trait Dynamic ( scaladoc ). Les classes qui étendent Dynamic obtiennent la méthode magique applyDynamic(methodName, args), qui est analogue à la method_missing de Ruby. A partir de Scala 2.9, l'option -Xexperimental doit être activé pour utiliser Dynamic.

Dans les langues statiquement typés, les fonctions membres sont invoquées directement. Si le compilateur ne peut pas comprendre que la fonction membre d'invoquer, le programme ne sera pas compilé. invocation méthode est, en ce sens, statique.

Dans les langues dynamiquement tapées, les fonctions membres ne sont pas directement invoqué. Au contraire, le code appelant envoie un message à un objet, puis l'exécution de la langue figure sur ce qu'il faut faire avec ce message. Par exemple, le moteur d'exécution va scanner l'objet d'une méthode avec le même nom, puis analysera l'objet d'une méthode avec le nom method_missing. invocation méthode est, en ce sens, dynamique.

C # 4 moissonneuses-batteuses typage statique avec typage dynamique. Une variable peut avoir un type de dynamic compilation. Tous les invocations de méthode sur cette variable seront traitées comme dans les langues dynamiquement tapées. Tous les invocations de méthode sur les variables avec des types statiques seront traités comme dans les langues statiquement typés.

# static invocation, bound at compile time by the compiler
var s = 6;
s.ToString();

# dynamic invocation, handled at runtime by the CLR
dynamic d = 6;
d.ToString();

Juste au poste de Randall plus, il est possible, mais la raison pour laquelle il va à l'encontre du paradigme statique est qu'il est au-delà de « l'expédition dynamique ». expédition dynamique vous permet de expédiez heureusement à une fonction qui est dynamique lié à une pièce statique connue du code. à-dire les ensembles de compilateur jusqu'à l'envoi qui est exécuté de façon déterministe à l'exécution, à partir de son point de vue.

Qu'est-ce que l'appel method_missing fait, est fait essentiellement un « fourre-tout » où vous décidez quoi faire en fonction du nom de la méthode à l'aide d'une instruction switch, ou quelque chose d'équivalent (dont je suis sûr que vous savez). Ainsi, le compilateur n'a aucune idée de ce qui va se passer ici. Disons que le compilateur fait quelque chose comme:

if (function is known at compile time)
{
  provide static call or dynamic call to "some" derivation
}
else
{
  bind the function call to obj.method_missing(...) and pass in the "details"
}

Ensuite, vous devez fournir method_missing comme ceci:

def method_missing(intendedFunctionName, arguments)
{
  if (intendedFunctionName is "X")
  {
    X may not need arguments, so just do something
  }
  else if (intendedFunctionName is "Y")
  {
    Y expects 5 arguments of varying types
    Throw exception if there isn't the right number or types
  }
  ... etc ...
}

Demander le compilateur de vous envoyer des arguments « arbitraires » (c.-à-pas connu au moment de la compilation) de types arbitraires, avec un intendedFunctionName que vous ne pouvez pas comptabilisera ... eh bien, ce n'est pas très sûr, et Scala vise à être un langage statiquement sûr.

Oui, il est faisable, mais pas dans l'esprit d'un langage statique. Si vous voulez vraiment ce type de flexibilité, la programmation est probablement Polyglotte votre ami.

Note: Objective-C est pas strictement typé statiquement. Il y a un moteur d'exécution sur lequel le code exécute et le système de typage dynamique ne permet pas de code à décaper ou inline comme C / C ++.

Objective-C a "method_missing" (en particulier, forwardInvocation et methodSignatureForSelector ) et il est sans doute typé statiquement. Cela fonctionne parce qu'il traitera les erreurs de type statiques comme des avertissements plutôt que des erreurs au moment de la compilation, depuis l'envoi de la méthode se produit lors de l'exécution dans une mesure beaucoup de plus que quelque chose comme des méthodes virtuelles en C ++ (ce qui est la raison pour laquelle vous pouvez avoir « method_missing »).

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