只需使用數組。您可以使用Array
方法,以確保你將永遠有一個數組,即使有人經過在只有一個值:
def debug(&block)
Array(block[]).each do |var| puts "#{var} = #{eval var.to_s, block}" end
end
x, y = 3, 5
debug {:x} # => "x = 3"
debug {[:x, :y]} # => "x = 3" "y = 5"
BTW:傳遞一個塊的結合不再是Ruby 1.9的工作。 (儘管文件稱,確實)。您必須顯式調用Proc#binding
來獲取該Proc
一個Binding
對象:本已經作品的Ruby 1.8
def debug(&block)
Array(block.()).flatten.each do |var|
puts "#{var} = #{eval var.to_s, block.binding}"
end
end
幸運的,所以你通過包含它可以保護您的代碼。
另一種方法是完全放棄該塊。我的意思是,你已經強制debug
的用戶使用在塊中傳遞參數的不熟悉的習慣用法,而不是在括號中。爲什麼不強迫他們只是通過綁定呢?
def debug(*vars, bnd)
vars.each do |var|
puts "#{var} = #{eval var.to_s, bnd}"
end
end
x, y = 3, 5
debug :x, binding # => "x = 3"
debug :x, :y, binding # => "x = 3" "y = 5"
這具有的增加的靈活性,他們實際上可以通過一個不同比一個調用點,例如結合如果他們想要在應用程序的另一部分中實際調試一段代碼的話。
BTW:這裏有一些有趣的Ruby 1.9.2的參數內省(Proc#parameters
):
def debug(&block)
block.parameters.map(&:last).each do |var|
puts "#{var} = #{eval var.to_s, block.binding}"
end
end
x, y = 3, 5
debug {|x|} # => "x = 3"
debug {|x, y|} # => "x = 3" "y = 5"
@Jörg,很好地完成。你認爲'Array(stuff)'會比'[* stuff] .flatten?更好嗎? – 2010-03-24 16:49:05
@Wayne Conrad:可能。坦率地說,我只是沒有想到它,因爲摔扁平坦的成語是如此深深地燒入我的大腦。如果你傳遞多個參數,'Array()'會中斷,這就是爲什麼我要避免它的原因,但在這種情況下,語言規範保證休息參數將永遠是一個數組。 – 2010-03-24 16:58:04
非常漂亮的寫作,Jörg。這幫助我瞭解了一些讓我困惑很長時間的塊。 +1 – 2010-03-24 18:17:50