ブロックパラメータのないメソッド定義がブロックを受け入れることができるのはなぜですか? これはデモコードです:
def fun
yield
end
fun {puts 'hello ruby'}
ブロックパラメータのないメソッド定義がブロックを受け入れることができるのはなぜですか? これはデモコードです:
def fun
yield
end
fun {puts 'hello ruby'}
それがルビーの仕組みだからです。どのメソッドにもブロックを渡すことができます。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