3

重複
の可能性: Ruby でこの &block は何ですか? そして、ここでメソッドでどのようにパスを取得しますか?

私はその&block部分を理解していません、それは何をしますか?

以下に例を示します。

def method_missing(method_name, *args, &block)
  @messages << method_name
  @object.send method_name, *args, &block
end
4

4 に答える 4

6

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.
于 2012-12-01T00:14:02.690 に答える
4

「そして、どうすればそれを別のメソッドに渡すことができますか?」ブライアンのコメント:

このような:

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 減分されます。composenbmapreduce

一方、ブロックを別のメソッドに渡す必要がない場合は、次のように単純に使用できます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]

力があなたと共にありますように。

于 2012-12-01T01:10:28.070 に答える
3

ブロックを、別のメソッドに渡すことができる proc オブジェクトに変換します。

于 2012-12-01T00:14:19.247 に答える
1

ブロックでメソッドを呼び出す場合、そのブロックを使用する方法は 2 つあります。

  • yieldメソッド内で呼び出す
  • 先頭に追加してProcオブジェクトに変換します&

2 番目の方法では、それを別のメソッドに渡すことができます。

したがって、あなたの場合、指定されたブロックをに変換し、それProcを呼び出しmethod_nameます。

引数と同じようにブロックを渡すことができると考えてください。

于 2012-12-01T00:21:36.250 に答える