2

ブロックパラメータのないメソッド定義がブロックを受け入れることができるのはなぜですか? これはデモコードです:

def fun
 yield
end
fun {puts 'hello ruby'}
4

1 に答える 1

4

それがルビーの仕組みだからです。どのメソッドにもブロックを渡すことができます。block_given?必要に応じてチェックするのは、そのメソッドの責任yieldです。

これは暗黙的なブロックの受け渡しです。ブロック パラメーターを宣言すると、別のことが起こります。ブロックは Proc オブジェクトに変換されるため、関数のように呼び出してパラメーターとして渡すことができます。暗黙のブロック(AFAIK)ではそれを行うことはできません。

def foo &block
  block.call 3
  bar block
end

# this method expects proc as a regular parameter (not a block), so you can pass  
#   a block in addition to it (if you so desire)
def bar block
  block.call 4
end

foo do |x|
  puts "this is #{x}"
end
# >> this is 3
# >> this is 4
于 2013-03-18T03:01:03.143 に答える