Was ist der äquivalente Ruby-Code zu dem folgenden in VBScript geschriebenen Code?
a = b = c
Abhängig vom Kontext, in dem der Code geschrieben wird, kann es sich um einen der folgenden beiden handeln.
a = (b == c)
(a == b) == c
VBScript behandelt sowohl die Zuweisung als auch den Vergleich mit einem Operator =
.
In VBScript sind Zuweisungen auch Anweisungen und keine Ausdrücke.
Infolgedessen können Personen, die Sprachen mit separaten Zuweisungs- und Vergleichsoperatoren gelernt haben, bei der Verwendung von VBScript unerwartetes Verhalten feststellen.
In vielen Sprachen sind die Grenzen zwischen Ausdrücken und Anweisungen mehr oder weniger eindeutig, sodass Sie Anweisungen in Kontexten schreiben können, in denen wahrscheinlich Ausdrücke erforderlich sind. Genau genommen ist die Funktionalität, die als Aussage in einer Sprache bereitgestellt wird, als Ausdruck in einer anderen Sprache bereitgestellt. Ruby ist ein gutes Beispiel, da viele der in anderen Sprachen bereitgestellten Aussagen Ausdrücke sind.
#if ist ein Ausdruck, keine Aussage
a = (if hoge == fuga then 1 else 0)
#Auch die Methodendefinition wird zum Ausdruck
a = (def hoge; end)
Die Ruby-Spezifikation, dass selbst wenn und Methodendefinitionen zu Ausdrücken werden, für Java-Programmierer anders aussieht. Einige mögen argumentieren, dass es übertrieben ist, diese zu formulieren.
Wir akzeptieren jedoch, was aus einem Satz vor langer Zeit gemacht wurde, und behandeln ihn als eine Formel ohne Unbehagen. Das ist die Aufgabe.
Der folgende Code kann als Beweis dafür ausgeführt werden, dass die Zuweisung als Ausdruck behandelt wird. Wenn die Zuordnung eine Anweisung ist, kann das Ergebnis nicht a zugewiesen werden.
a = b = c
In VBScript-Zuweisungen handelt es sich jedoch um Anweisungen, nicht um Ausdrücke.
Beide = von a = b = c
können nicht zugewiesen werden.
Daher ist der Ruby-Code, der VBSkripts "a = b = c" entspricht, "a = (b == c)" oder "(a == b) == c". Es gibt zwei Möglichkeiten. Wann wird es als das erstere interpretiert und wann wird es als das letztere interpretiert?
Ich erinnere mich wieder an die Spezifikation, dass Zuweisungen eher Aussagen als Ausdrücke sind. Ersteres ist ein Ausdruck, während letzteres ein Satz ist. Mit anderen Worten, der Kontext, in dem dieser Code geschrieben wird, hängt davon ab, ob die Anweisung oder der Ausdruck erforderlich ist.
'Der Kontext, in dem der Ausdruck benötigt wird
Call Func(a = b = c)
While a = b = c
'Der Kontext, in dem die Anweisung erforderlich ist
a = b = c
Recommended Posts