2013-08-01 20 views
5

zmienne dla blokowe są obowiązkowe:Dlaczego zmienne blokowe są opcjonalne?

def foo arg; end 
foo # => ArgumentError 

W celu umożliwienia opcjonalne argumenty, wartość domyślna musi być dostarczona:

def foo arg = nil; end 
foo # => nil 
zmienne

Ale blokowe są opcjonalne:

def foo █ end 
foo # => nil 

Bez wartości domyślnej brak zmiennej blokowej jest przypisywany nil, a zmienne blokowe nie mogą przyjmować wartości domyślnych:

def foo &block = ->{puts :foo}; end 
# => syntax error 

Wręcz przeciwnie, metoda może wziąć dodatkowy blok, który nie jest wymagany w definicji:

def foo; end 
foo{puts :foo} # => nil 

co jest zaletą zmiennych pakietowych jest zaprojektowany tak, w przeciwieństwie do braku bloku zmienne?

Odpowiedz

4

Nie byłoby większego sensu wyrzucanie błędu, gdy żaden blok nie jest podany, ponieważ każda metoda, która używa albo yield lub block.call, i tak spowoduje błąd, jeśli nie ma bloku. Nie byłoby też wiele punktów dostarczających blok domyślny, ponieważ domyślny kod do wykonania może być zapisany w samej metodzie (co byłoby dużo lepsze niż zapisanie go w linii z argumentami).

Powiązane problemy