Do tej pory myślałem o boo ||= "foo" jako naturalnym(lepszym) zamienniku dla instrukcji
boo = "foo" if boo.nil?
Czyli do zmiennej boo przypisujemy "foo" jeśli boo jest nil'em. Fakt ten jest opisany na wielu stronach, także w książce "Programowanie w Języku Ruby" czytamy:
words[key] ||= []
"...jeśli wpis w tablicy asocjacyjnej words dla klucza key nie istnieje(nil), wartością zwracaną przez || będzie drugi operand, > czyli nowa pusta tablica. Dlatego ten wiersz kodu przypisze tablice elementowi tablicy asocjacyjnej który nie ma jeszcze > wartości..."
I w takiej świadomości dość długo żyłem, dlatego metoda typu
def foo(options = {})
options[:boo] ||= true
options[:bar] ||= "r"
end
wydawała mi się całkowicie poprawna.
Niestety tak nie jest, przekazanie do metody :boo => false i tak powodowało ustawienie options[:boo] na true, z początku myślałem ze w nocy ktoś mi podmienił interpreter. Zajrzałem na strone (bardzo dobre źródło wiedzy o idiomach ruby) "Ruby: idmioms":http://www.rubygarden.org/ruby/page/show/RubyIdioms i moje wątpliwosci zostaly rozwiane
bq. You can also use the ||= operator to assign a value to a variable if it evaluates to false.
Do tej pory dałbym sobie rękę uciąć że ||= przypisuje wartość tylko gdy zmienna jest nil'em, i "...bym teraz k** ręki nie miał".
Ruby ma kilka takich niuansów, które trzeba znać by sobie krzywdy nie zrobić :). W sumie każdy język ma takie swoje “myki”.
Nawet jak masz duże doświadczenie to każdy język potrafi cię zaskoczyć w pewnych momentach.
Ja tam się nie mogę przesiąść na ruby. Cały czas koduje w php5 i nie mam większości problemów, tyle ze jest to bardziej czasochłonne.