Dziwne zachowanie ||= 3

Posted by wijet
on Sunday, November 04

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ł".

Comments

Leave a response

  1. RadarekNovember 04, 2007 @ 03:48 PM

    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”.

  2. maxDecember 05, 2008 @ 09:19 AM

    Nawet jak masz duże doświadczenie to każdy język potrafi cię zaskoczyć w pewnych momentach.

  3. lukixMarch 06, 2009 @ 08:45 PM

    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.

Comment