LoginSignup
7
6

【Ruby】ブロックを理解したい

Last updated at Posted at 2023-11-02

概要

ルビーのブロックは、コードの柔軟性と再利用性を高める強力なツールです。 これを活用すると、メソッドの動作を簡単にカスタマイズでき、これはルビーのさまざまなライブラリやフレームワークでも活用されています。 この記事では、ルビーが提供するブロックが何なのか、そしてどのように使用するのかについて見ていきましょう。

対象とする読者

  • 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?:ブロックを作成したかを判断するためのメソッドです。
7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6