概要
ルビーのブロックは、コードの柔軟性と再利用性を高める強力なツールです。 これを活用すると、メソッドの動作を簡単にカスタマイズでき、これはルビーのさまざまなライブラリやフレームワークでも活用されています。 この記事では、ルビーが提供するブロックが何なのか、そしてどのように使用するのかについて見ていきましょう。
対象とする読者
- Rubyのブロックを知らない人
ブロック
ブロックとは、メソッドが特定の時点で実行できるコードです。 ルビーでブロックを作成する文法はdo···end
と{ }
の2つが存在します。 普通ブロックのコードがシングルラインなら{}
、マルチラインならdo···end
を使います。
{ }
method { puts "ここはブロックです。" }
do...end
method do
puts "ここはブロックです。"
end
yield
ブロックとは何かを学びました。 では、一体ブロックはどのように実行すべきでしょうか? ルビーがそのためにyield
というキーワードを提供します。 ルビーはメソッド内でyield
というキーワードを見つけたらブロックのコードを実行します。
def method
puts "ここはメソッドの始まりです。"
yield
puts "ここはメソッドの終わりです。"
end
method { puts "ここはブロックです。" }
# 実行結果
# "ここはメソッドの始まりです"
# "ここはブロックです。"
# "ここはメソッドの終わりです。"
yield
キーワードを複数回使用してブロックを繰り返し実行することも可能です。
def method
puts "ここはメソッドの始まりです。"
yield
yield
puts "ここはメソッドの終わりです。"
end
method { puts "ここはブロックです。" }
# 実行結果
# "ここはメソッドの始まりです。"
# "ここはブロックです。"
# "ここはブロックです。"
# "ここはメソッドの終わりです。"
ちなみにyield
はブロックが返す値をそのまま返します。
def method
puts "ここはメソッドの始まりです。"
value = yield
puts value
puts "ここはメソッドの終わりです。"
end
method { "ここはブロックです。" }
# 実行結果
# "ここはメソッドの始まりです。"
# "ここはブロックです。"
# "ここはメソッドの終わりです。"
途中でブロックでreturn
を使うとどうなると思いますか? ブロックはその場で実行を停止します。 言い換えれば、yield
キーワードの次のコードを実行しません。
def method
puts "ここはメソッドの始まりです。"
yield
puts "ここはメソッドの終わりです。"
end
method do
puts "ここはブロックです。"
return
end
# 実行結果
# "ここはメソッドの始まりです。"
# "ここはブロックです。"
block_given?
yield
キーワードを使用するときは、必ずブロックを作成してください。 そうしないとエラーが発生します。
def method
puts "ここはメソッドの始まりです。"
yield
puts "ここはメソッドの終わりです。"
end
method
# 実行結果
# ここはメソッドの始まりです。
# block.rb:3:in `method': no block given (yield) (LocalJumpError)
# from block.rb:8:in `<main>'
ルビーはブロックを作成したかを判断できるblock_given?
というメソッドを提供します。 もしブロックを作成した場合にのみブロックを実行したい場合は、block_given?
メソッドを活用します。
def method
puts "ここはメソッドの始まりです。"
if block_given?
yield
end
puts "ここはメソッドの終わりです。"
end
method
# 実行結果
# ここはメソッドの始まりです。
# ここはメソッドの終わりです。
パラメータ
ブロックもパラメータを定義できます。yield
キーワードを使う時、引数を渡します。
def method
puts "ここはメソッドの始まりです。"
yield "ルビー"
puts "ここはメソッドの終わりです。"
end
method { |name| puts "ここは #{name} ブロックです。" }
# 実行結果
# ここはメソッドの始まりです。
# ここはルビーブロックです。
# ここはメソッドの終わりです。
パラメータを複数定義することも可能です。 ただ、既存のメソッドのようにパラメータが定義された順序で引数を渡す必要があるため、注意しましょう。
def method
puts "ここはメソッドの始まりです。"
yield "ルビー", "簡単ですよね?"
puts "ここはメソッドの終わりです。"
end
method { |name, word| puts "ここは #{name} ブロックです! #{word}" }
# 実行結果
# ここはメソッドの始まりです。
# ここはルビーブロックです。簡単ですよね?
# ここはメソッドの終わりです。
まとめ
先ほど学んだ内容を簡単にまとめます。
- ブロック:メソッドが特定の時点で実行できるコードです。 文法は
do...end
または{ }
を使います。 - yield: ブロックを実行するためにメソッドで使用するキーワードです。 引数を使用して、ブロック パラメータに値を渡すことができます。
- block_given?:ブロックを作成したかを判断するためのメソッドです。