jeśli oświadczenia nie wprowadzają zakresu w Ruby 1.9, jakie jest uzasadnienie tej zmiany w stosunku do Ruby 1.8?
jeśli oświadczenia nie wprowadzają zakresu w Ruby 1.9, jakie jest uzasadnienie tej zmiany w stosunku do Ruby 1.8?
Odpowiedzi:
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 if
pozwalają 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 name
sposobu. Jeden, który zostanie użyty, jeśli String.encode
metoda 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 if
instrukcja wprowadziła nowy zakres, nowa metoda lub klasa istniałaby tylko i byłaby używana w ramach if
instrukcji. 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.
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.