Frage

Ich habe nicht viel Erfahrung mit statisch typisierten Sprachen (derzeit Scala lernen und lieben es!), Aber eine Sache, die ich bemerkt habe ist, dass sie nicht immer scheinen so etwas wie Ruby zu haben method_missing oder Coldfusion des onMissingMethod. Gibt es eine inhärente Beschränkung in statisch typisierten Sprachen, die verhindern oder diese schwer machen?

War es hilfreich?

Lösung

Auf jeden Fall ein Mechanismus sie für den Umgang mit hinzugefügt werden könnte, aber es ist im Widerspruch mit dem, was statischer Typisierung ist. Compile-Zeit Bestimmung, dass Ihr Programm vom Typ fehlerfrei ist

Nachtrag

Scala 2.9 eingeführt, um eine experimentelle Option ermöglicht diese Art von dynamischem Handling von Zugriffen auf Typen in einer Weise, die ansonsten statische Typprüfung fehlschlagen würde. Es wurde verfeinert und aus nicht-experimentellen in 2.10, obwohl es nach wie vor durch einen Standardsperre Feature-Flag gesteuert wird. Sie können in der SIP 17 Dokument lesen. Siehe SIP 18 für eine Erklärung der Scala 2.10 des "Modularisierung" und Feature-Flags.

Andere Tipps

Scala Version 2.9 führt diese Funktionalität durch die Dynamic Eigenschaft ( scaladoc ). Klassen, die Dynamic erhalten die magische Methode applyDynamic(methodName, args) erweitern, die Rubys method_missing analog ist. Ab Scala 2.9 muss die -Xexperimental Option Gebrauch Dynamic aktiviert werden.

In statisch typisierten Sprachen, Member-Funktionen werden direkt aufgerufen. Wenn der Compiler nicht herausfinden können, welche Member-Funktion aufzurufen, wird das Programm nicht kompilieren. Methodenaufruf ist, in diesem Sinne statisch.

In dynamisch typisierten Sprachen, Member-Funktionen sind nicht direkt aufgerufen. Vielmehr sendet an ein Objekt eine Nachricht Code aufrufen, und dann die Sprache Laufzeit herausfindet, was mit dieser Botschaft zu tun. Zum Beispiel sucht die Laufzeit das Objekt für eine Methode mit dem gleichen Namen, und dann mit dem Namen method_missing das Objekt für eine Methode scannt. Methodenaufruf ist, in diesem Sinne, dynamisch.

C # 4 kombiniert statische Typisierung mit dynamischer Typisierung. Eine Variable kann einen Compiler-Typen von dynamic hat. Jedes Verfahren, Anrufungen auf dieser Variable wird in dynamisch typisierten Sprachen behandelt werden. Jegliche Methode Anrufungen auf Variablen mit statischen Typen wird als in statisch typisierten Sprachen behandelt werden.

# 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();

Just weiter Randall Post ist es möglich, aber der Grund, es geht gegen das statische Paradigma ist, dass es über „dynamische Dispatch“ ist. Dynamische Dispatch glücklich können Sie auf eine Funktion, versenden, die sich dynamisch an einen bekannten statischen Stück Code gebunden ist. das heißt, die Compiler richten den Versand, die zur Laufzeit deterministisch ausgeführt wird, aus seiner Perspektive.

Was die method_missing Aufruf der Fall ist, wird im Wesentlichen eine machen „catch all“, wo Sie entscheiden, was auf der Grundlage der Methodennamen zu tun, um eine switch-Anweisung, oder etwas Gleichwertiges (was ich bin sicher, Sie wissen). Somit hat der Compiler keine Ahnung, was hier passieren wird. Lassen Sie uns sagen, dass der Compiler tat so etwas wie:

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"
}

Dann haben Sie method_missing so bieten:

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 ...
}

Fragen an den Compiler „willkürlich“ Argumente beliebiger Typen (dh nicht bei der Kompilierung bekannt) zu senden, mit einem intendedFunctionName, dass Sie nicht für möglicherweise werden Buchhaltung ... na ja, es ist nicht sehr sicher, und Scala sollte sein eine statisch sichere Sprache.

Ja, es ist machbar, aber nicht im Sinne einer statischen Sprache. Wenn Sie wirklich diese Art von Flexibilität, Programmierung polyglott wollen, ist wahrscheinlich dein Freund.

Hinweis: Objective-C nicht streng ist statisch typisiert. Es gibt einen Runtime-Engine, auf das der Code ausführt und das dynamische Typisierung System keinen Programmcode erlauben wie C / C gestrippt oder inlined wird ++.

Objective-C hat "method_missing" (genauer gesagt, forwardInvocation und methodSignatureForSelector ), und es wird wohl statisch typisiert. Dies funktioniert, weil es eher statischen Typ Fehler als Warnungen behandeln als Fehler bei der Kompilierung, da Methode Dispatch zur Laufzeit in einem viel größeren Ausmaß als so etwas wie virtuelle Methoden in C auftritt ++ (und aus diesem Grund können Sie „method_missing“ haben).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top