Warum, wenn Aussagen in Ruby 1.9 keinen Geltungsbereich einführen?

Antworten:

9

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 ifAnweisungen 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 nameMethode. Eine, die verwendet wird, wenn die String.encodeMethode 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 ifAnweisung einen neuen Bereich einführen würde, würde die neue Methode oder Klasse nur innerhalb der Grenzen der ifAnweisung 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.

Berin Loritsch
quelle
1

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.

Paddyslacker
quelle