Wenn Aussagen in Ruby 1.9 keinen Geltungsbereich einführen , was ist der Grund für diese Änderung von Ruby 1.8?
Wenn Aussagen in Ruby 1.9 keinen Geltungsbereich einführen , was ist der Grund für diese Änderung von Ruby 1.8?
Zwei Gründe, warum dies in Ruby 1.9 durchgeführt wurde, sind auf den folgenden Folien aufgeführt, obwohl dies ohne den Dialog des Präsentators möglicherweise nicht offensichtlich ist. Mit den if
Anweisungen ohne Gültigkeitsbereich können Sie zwei Dinge in Ihrem Quellcode definieren, auf die außerhalb der if-Anweisung zugegriffen werden kann.
Erstes Beispiel: Methoden ersetzen
class Employee
if String.method_defined?(:encode)
def name
...
end
else
def name
...
end
end
end
In diesem Beispiel gibt es zwei verschiedene Definitionen für die name
Methode. Eine, die verwendet wird, wenn die String.encode
Methode vorhanden ist, und eine (minderwertige Implementierung), die verwendet wird, wenn die Codierungsmethode nicht vorhanden ist. Auf diese Weise können Sie im Wesentlichen eine korrekt codierte Zeichenfolge verwenden, wenn die Bibliotheken dies unterstützen.
Zweites Beispiel: Implementierung ersetzen
if String.method_defined?(:encode)
module Builder
...
end
else
class String
...
end
end
In diesem Beispiel stellen wir eine völlig andere Klasse / ein anderes Modul bereit, je nachdem, ob eine Bibliotheksfunktion vorhanden ist. Auf diese Weise können Sie einen völlig anderen Algorithmus verwenden, der eine neue Bibliotheksfunktion verwendet, während Sie dennoch auf einen weniger effizienten oder vollständigen Algorithmus zurückgreifen, der nah genug ist, wenn er nicht vorhanden ist.
Das alles wichtige warum
Was kauft dir das? Wenn die if
Anweisung einen neuen Bereich einführen würde, würde die neue Methode oder Klasse nur innerhalb der Grenzen der if
Anweisung existieren und verwendet werden . Diese Einschränkung macht es sehr schwierig, eine Bibliothek zu unterstützen, die Änderungen für Ruby 2.0 benötigt, wenn wir in Zukunft von 1.9 abwandern.
Mit den beiden Beispielen in der Präsentation, auf die Sie verlinkt haben, besteht die Überlegung darin, eine Codebasis für Ihre Bibliotheken beizubehalten und gleichzeitig mehrere Versionen von Ruby zu unterstützen. Ich glaube, es entstand aus dem Schmerz des Übergangs zwischen Ruby 1.8 und Ruby 1.9. Da das Ruby-Team stetig auf 2.0 zusteuert, können Sie Ihre Benutzer auch bei inkompatiblen Änderungen unterstützen. Ich glaube, es gab einige zwischen 1.9.1 und 1.9.2. In Zukunft wird es mehr geben.
Ich bin kein Experte, aber wenn Sie sich die Ruby-FAQ hier ansehen: http://arc.apotheon.org/ruby/faq/rubyfaq-2.php
Abschnitt 2.3 "Wann wird auf eine lokale Variable zugegriffen?" zeigt das aktuelle Verhalten.
Um das Scoping-Problem zu umgehen, ist eines der etwas "hackigen" Dinge, die Sie derzeit tun müssen:
Es wird empfohlen, vor dem Zugriff auf eine lokale Variable eine Zuweisungsanweisung wie a = nil einzugeben, um das Verhalten lokaler Variablen nicht zu beeinträchtigen.
Ich glaube, dass 1.9 die Notwendigkeit beseitigt, dies zu tun, und dies könnte einer der Treiber für das neue Verhalten sein.