閉鎖です。これは、他の言語で機能するように関数を一時停止するようなものです。つまり、Rubyでは、コレクションを反復処理する2つのオプションがあります。
for elem in collection
# do something
end
また
collection.each do |elem|
# do something
end
この2つには違いがありますが、ここでは説明しません。ご覧のとおり、関数をメソッドに渡して内部で実行するようなものです。do |variables| ... end
ただし、ブロックを渡すには、ブロックまたはブロックを使用する2つの方法もあり{ |variables| ... }
ます。ブロックを受け入れる独自のメソッドを作成する場合は、複数の方法があります(少し異なりますが、同じように実行されます)。
def run_3_times
yield
yield
yield
end
また
def run_3_times(&block)
block.call
block.call
block.call
end
どちらも同じように呼ばれます。
run_3_times { puts 'hello' }
# will yield
hello
hello
hello
ただし、ブロックが渡されない場合は別のエラーが発生します。
# when using yield
LocalJumpError: no block given (yield)
# when using Proc.call
NoMethodError: undefined method `call' for nil:NilClass
from (pry):8:in `run_3_times'
ここにそれについてのいくつかの記事があります: