2011-03-09 4 views

答えて

7

アスタリスク*は、残りのすべての引数を、引数で指定された単一のリストに結合することを意味します。アンパサンド&は、ブロックがメソッド呼び出しに渡された場合(つまり、block_given?がtrueの場合)、それを引数で指定された新しいProcに格納します(または疑似 - 引数)。

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. 

&オペレータそんなに

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

おかげで、完全にそれを説明する:関数を呼び出すときに指定したブロックとしてPROCオブジェクトを「拡張」するために使用することができます。 – Chris

+0

同様に、 'array.each(&proc)'はブロック引数としてオブジェクト 'proc'を'#each'メソッドに渡します。そして、もしあなたがコマンド引数とブロックの配列を持っていたら、 'cmd(cmd)の各要素を引数として渡し、ブロック(block)'を 'sh(* cmd、&block)'と呼ぶことができます。 – Peeja

+0

@Peeja:そうですね、忘れてしまいました。私は答えを更新します。 – maerics

関連する問題