3
メソッドを宣言するとき、引数のさまざまな接頭辞はどういう意味ですか?メソッドを宣言するとき、さまざまな引数プレフィックスは何を意味しますか?
sh(*cmd, &block)
cmd
前*
は何を意味するのでしょうか?
&
は、block
の前に何を意味しますか?
メソッドを宣言するとき、引数のさまざまな接頭辞はどういう意味ですか?メソッドを宣言するとき、さまざまな引数プレフィックスは何を意味しますか?
sh(*cmd, &block)
cmd
前*
は何を意味するのでしょうか?
&
は、block
の前に何を意味しますか?
アスタリスク*
は、残りのすべての引数を、引数で指定された単一のリストに結合することを意味します。アンパサンド&
は、ブロックがメソッド呼び出しに渡された場合(つまり、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]
おかげで、完全にそれを説明する:関数を呼び出すときに指定したブロックとしてPROCオブジェクトを「拡張」するために使用することができます。 – Chris
同様に、 'array.each(&proc)'はブロック引数としてオブジェクト 'proc'を'#each'メソッドに渡します。そして、もしあなたがコマンド引数とブロックの配列を持っていたら、 'cmd(cmd)の各要素を引数として渡し、ブロック(block)'を 'sh(* cmd、&block)'と呼ぶことができます。 – Peeja
@Peeja:そうですね、忘れてしまいました。私は答えを更新します。 – maerics