Following articleにやや同等です
は、Rubyの「&」の使用上の良い説明を提供します:Rubyで
暗黙のブロック の方法は、あらゆる種類の引数を取ることができます面白い方法の。特に興味深いケースの1つは、Rubyメソッドがブロックを取得する場合です。
が
def hello
end
hello do
puts "hello"
end
これはせずに実行されます:
は実際には、すべてのRubyのメソッドは、暗黙的にパラメータリストでこれを指定する必要またはメソッド本体例えば以内にブロックを使用することなく、ブロックを取ることができます私たちは私たちが渡しているブロックを実行していないとのトラブルは何もプリントアウトされます私たちがすることができます - もちろん - 簡単にyielding
でブロックを実行します。
def hello
yield if block_given?
end
hello do
puts "hello"
end
ティsの時間は、我々はいくつかの出力を得る:メソッド内のブロックに
hello
我々yielded
を、しかし、この方法は、ブロックを取るという事実はまだ暗黙的です。
Rubyではオブジェクトをメソッドに渡して、このオブジェクトをブロックとして使用しようとするので、さらに面白いです。メソッドの最後のパラメータの前にアンパサンドを置くと、Rubyはこのパラメータをメソッドのブロックとして扱います。パラメータがの場合、Procオブジェクトが既に存在する場合、Rubyはメソッドとそのブロックを単に関連付けます。
def hello
yield if block_given?
end
blah = -> {puts "lambda"}
hello(&blah)
lambda
パラメータがProc
でない場合は、Rubyはそのブロックなどの方法でそれを関連付ける前に、(それにto_procを呼び出すことで)1に変換しようとします。
def hello
yield if block_given?
end
class FooBar
def to_proc
-> {puts 'converted lambda'}
end
end
hello(&FooBar.new)
converted lambda
このすべては、かなり明確なようだが、私はメソッドに関連付けられたブロックを取り、別のメソッドに渡すために何をしたい場合は?ブロックを参照する方法が必要です。
Explicitブロック メソッド定義を記述するとき、このメソッドがブロックを取る可能性があると明示的に宣言することができます。紛らわしいこと、Rubyは、同様にこのためのアンパサンドを使用しています。
def hello(&block)
yield if block_given?
end
hello do
puts "hello"
end
が私たちのメソッドを定義し、このように、私たちがメソッドの本体内で私たちのブロックを参照することが可能な名前を与えます。そして、私たちのブロックがProc
オブジェクトであるため、代わりにそれにyielding
の、我々はそれをcall
ことができます。
def hello(&block)
block.call if block_given?
end
hello do
puts "hello"
end
私はblock.call
代わりのyield
を好む、それは物事が明確になります。もちろん、私たちのメソッドを定義するときに、「ブロック」という名前を使用する必要はありません。
def hello(&foo)
foo.call if block_given?
end
hello do
puts "hello"
end
これは言いました。 'block'は良い規則です。
私はそれが返されたものについてto_procメソッドを呼び出すと信じています。 –