2011-03-09 34 views

回答

7

星號*表示將所有剩餘參數組合到由參數命名的單個列表中。和號&表示如果給方法調用一個塊(即block_given?將爲真),則將其存儲在由參數命名的新Proc中(或者 -argument,我猜)。

def foo(*a) 
    puts a.inspect 
end 
foo(:ok) # => [:ok] 
foo(1, 2, 3) # => [1, 2, 3] 

def bar(&b) 
    puts b.inspect 
end 
bar() # => nil 
bar() {|x| x+1} # => #<Proc:0x0000000100352748> 

注意,&必須出現最後,如果使用的話,和*可能是下一個到最後一個之前,或者它必須是最後一個。

*操作者也可用於「擴展」數組到參數列表在呼叫時間(而不是在一個定義爲「組合」起來),像這樣:

def gah(a, b, c) 
    puts "OK: a=#{a}, b=#{b}, c=#{c}" 
end 
gah(*[1, 2, 3]) # => "OK: a=1, b=2, c=3" 
gah(1, *[2, 3]) # => "OK: a=1, b=2, c=3" # must be last arg. 

類似地,&操作者可用於在調用函數時將Proc對象作爲給定塊「擴展」:

def zap 
    yield [1, 2, 3] if block_given? 
end 
zap() # => nil 
zap(&Proc.new{|x|puts x.inspect}) # => [1, 2, 3] 
+0

非常感謝,這就很好地解釋了它。 – Chris

+0

類似地,'array.each(&proc)'將對象'proc'作爲塊參數傳遞給方法'#each'。如果你有一個命令參數和一個塊的數組,你可以調用'sh(* cmd,&block)'來傳遞'cmd'中的每個元素作爲參數,'block'作爲塊。 – Peeja

+0

@Peeja:對,忘記了,我會更新我的答案。 – maerics

相關問題