2013-08-01 12 views
5

Nicht-Block-Variablen sind obligatorisch:Warum sind Blockvariablen optional?

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

Aber Blockgrößen sind optional:

def foo █ end 
foo # => nil 

def foo arg; end 
foo # => ArgumentError 

Um optionale Argumente zu ermöglichen, wird ein Standardwert zugeführt werden muss,

Ohne einen Standardwert wird eine abwesende Blockvariable nil zugewiesen, und Blockvariablen können keine Standardwerte annehmen:

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

Im Gegenteil, ein Verfahren einen zusätzlichen Block nehmen, die nicht in der Definition erforderlich:

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

Was ist der Vorteil von Blockgrößen ist wie diese nicht-Block im Gegensatz ausgebildet ist, Variablen?

Antwort

4

Es würde nicht viel geben einen Fehler zu werfen, wenn kein Block gegeben wird, da jede Methode, die entweder yield oder block.call verwendet, einen Fehler trotzdem werfen wird, wenn es keine Blockierung gibt. Es würde auch nicht viel Sinn machen, einen Standardblock zu liefern, da der auszuführende Standardcode einfach in die Methode selbst geschrieben werden kann (was viel besser wäre, als inline mit den Argumenten zu schreiben).