私はその&block
部分を理解していません、それは何をしますか?
以下に例を示します。
def method_missing(method_name, *args, &block)
@messages << method_name
@object.send method_name, *args, &block
end
私はその&block
部分を理解していません、それは何をしますか?
以下に例を示します。
def method_missing(method_name, *args, &block)
@messages << method_name
@object.send method_name, *args, &block
end
Blocks
メソッドに渡すコールバックを記述する機会を提供します。
ここ&
で重要です-@pstが述べたように、ブロックをProcに「昇格」させ、Procを指定された名前の変数にバインドします。
と &
def time(&block)
puts block
end
time
# => nil
time { foo }
# => #<Proc:0x00029bbc>
それなし &
def time(block)
puts block
end
time { foo }
# => ArgumentError: wrong number of arguments (0 for 1)
# Because & isn't included, the method instead expected an arguement,
# but as a block isn't a arguement an error is returned.
「そして、どうすればそれを別のメソッドに渡すことができますか?」ブライアンのコメント:
このような:
def compose init_value, n=2, &b
if n==0 then init_value else
b.call( compose init_value, n - 1, &b )
end
end
compose 2 do |n| n * n end
#=> 16
compose 2, 4 do |n| n * n end
#=> 65536
compose 2, 4 do |n| n * 0.5 end
#=> 0.125
これは、同じブロックを数回再帰的に適用する再帰的な方法です。ここでは、引数にパッケージ化されたブロックが呼び出されますが、同時にメソッドb
に再帰的に渡されますが、引数は 1 減分されます。compose
n
b
map
reduce
一方、ブロックを別のメソッドに渡す必要がない場合は、次のように単純に使用できますyield
。
def apply_block_to_1_2_3
return yield( 1 ), yield( 2 ), yield( 3 )
end
apply_block_to_1_2_3 { |n| n * n }
#=> [1, 4, 9]
力があなたと共にありますように。
ブロックを、別のメソッドに渡すことができる proc オブジェクトに変換します。
ブロックでメソッドを呼び出す場合、そのブロックを使用する方法は 2 つあります。
yield
メソッド内で呼び出すProc
オブジェクトに変換します&
2 番目の方法では、それを別のメソッドに渡すことができます。
したがって、あなたの場合、指定されたブロックをに変換し、それProc
を呼び出しmethod_name
ます。
引数と同じようにブロックを渡すことができると考えてください。