Dlaczego jeśli oświadczenia nie wprowadzają zakresu w Ruby 1.9?

Odpowiedzi:

9

Dwa powody, dla których zostało to zrobione w Ruby 1.9, znajdują się na poniższych slajdach, chociaż może to nie być oczywiste bez dialogu prezentera. Dwie rzeczy, na które ifpozwalają ci instrukcje no scope , to zdefiniowanie w kodzie źródłowym rzeczy, do których można uzyskać dostęp poza instrukcją if.

Pierwszy przykład: zamień metody

class Employee
  if String.method_defined?(:encode)
    def name
      ...
    end
  else
    def name
      ...
    end
  end
end

W tym przykładzie, istnieją dwa różne definicje dla namesposobu. Jeden, który zostanie użyty, jeśli String.encodemetoda istnieje, i jeden (gorsza implementacja), który zostanie użyty, jeśli metoda kodowania nie istnieje. Zasadniczo pozwala to na użycie poprawnie zakodowanego ciągu, jeśli biblioteki go obsługują.

Drugi przykład: zamień implementację

if String.method_defined?(:encode)
  module Builder
    ...
  end
else
  class String
    ...
  end
end

W tym przykładzie zapewniamy zupełnie inną klasę / moduł w zależności od tego, czy istnieje funkcja biblioteki. Pozwala to na uzyskanie zupełnie innego algorytmu, który korzysta z nowej funkcji biblioteki, a jednocześnie powraca do mniej wydajnego lub kompletnego algorytmu, który jest wystarczająco blisko, jeśli nie istnieje.

Wszystko ważne dlaczego

Więc co to kupuje? Gdyby ifinstrukcja wprowadziła nowy zakres, nowa metoda lub klasa istniałaby tylko i byłaby używana w ramach ifinstrukcji. To ograniczenie bardzo utrudnia obsługę biblioteki, która będzie wymagała zmian w Ruby 2.0 podczas migracji z wersji 1.9 w przyszłości.

W obu przykładach przedstawionych w prezentacji, z którą się łączysz, powodem jest utrzymanie jednej bazy kodu dla bibliotek przy jednoczesnym wspieraniu wielu wersji Ruby. Uważam, że zrodził się z bólu przejścia między Ruby 1.8 a Ruby 1.9. Ponieważ zespół Ruby stale zmierza w kierunku wersji 2.0, nadal będziesz mógł wspierać swoich użytkowników, gdy pojawią się niezgodne zmiany. Uważam, że było kilka między 1.9.1 a 1.9.2. W przyszłości będzie ich więcej.

Berin Loritsch
źródło
1

Nie jestem ekspertem, ale jeśli spojrzysz na Ruby FAQ tutaj: http://arc.apotheon.org/ruby/faq/rubyfaq-2.php

Sekcja 2.3 „Kiedy zmienna lokalna staje się dostępna?” pokazuje bieżące zachowanie.

Aby obejść kwestię określania zakresu, jedną z nieco „hackujących” rzeczy, które musisz teraz zrobić, jest:

Zaleca się umieszczenie instrukcji przypisania, takiej jak = zero, przed uzyskaniem dostępu do zmiennej lokalnej, aby nie przeszkadzało jej takie zachowanie zmiennych lokalnych.

Uważam , że 1.9 usunie potrzebę tego, i może to być jeden ze sterowników nowego zachowania.

Paddyslacker
źródło