Rubyのブロックとイテレータは、コードの再利用性と簡潔性を高めるための強力な機能です。ブロックは、一時的なコードの塊であり、メソッドに渡すことができるコードの一部です。イテレータは、コレクション(配列やハッシュなど)を巡回するために使用されるメソッドです。以下に、Rubyのブロックとイテレータについて詳しく解説します。
ブロック
ブロックは、メソッドに渡すことができる一時的なコードの塊です。ブロックはdo...end
または中括弧 {...}
を使用して定義されます。
基本的な構文
# do...end を使ったブロック
[1, 2, 3].each do |num|
puts num
end
# {} を使ったブロック
[1, 2, 3].each { |num| puts num }
ブロックの使い方
ブロックはメソッドの呼び出し時に渡すことができます。例えば、each
メソッドはブロックを受け取り、配列の各要素に対してブロック内のコードを実行します。
[1, 2, 3].each do |num|
puts num
end
ブロック付きメソッドの定義
ブロックを受け取るメソッドを定義することもできます。yield
キーワードを使用して、渡されたブロックを呼び出します。
def greet
puts "Hello"
yield if block_given?
puts "Goodbye"
end
greet { puts "How are you?" }
# 出力:
# Hello
# How are you?
# Goodbye
block_given?
メソッド
block_given?
メソッドを使用して、ブロックが渡されたかどうかを確認できます。
def greet
puts "Hello"
if block_given?
yield
else
puts "No block given."
end
puts "Goodbye"
end
greet
# 出力:
# Hello
# No block given.
# Goodbye
イテレータ
イテレータは、コレクションの各要素を巡回するために使用されるメソッドです。Rubyには、each
、map
、select
などのさまざまなイテレータが用意されています。
each
メソッド
each
メソッドは、配列やハッシュなどのコレクションの各要素に対してブロック内の処理を実行します。
[1, 2, 3].each do |num|
puts num
end
map
メソッド
map
メソッドは、配列の各要素に対してブロック内の処理を実行し、新しい配列を作成します。
squared_numbers = [1, 2, 3, 4].map do |num|
num * 2
end
puts squared_numbers # 出力: [2, 4, 6, 8]
select
メソッド
select
メソッドは、配列の各要素に対してブロック内の条件を評価し、条件が真となる要素を含む新しい配列を作成します。
even_numbers = [1, 2, 3, 4, 5].select do |num|
num.even?
end
puts even_numbers # 出力: [2, 4]
reject
メソッド
reject
メソッドは、配列の各要素に対してブロック内の条件を評価し、条件が偽となる要素を含む新しい配列を作成します。
odd_numbers = [1, 2, 3, 4, 5].reject do |num|
num.even?
end
puts odd_numbers # 出力: [1, 3, 5]
カスタムイテレータ
独自のイテレータを定義することもできます。例えば、範囲内の数値を1つずつ取り出すカスタムイテレータを定義することができます。
def upto(limit)
num = 0
while num <= limit
yield(num)
num += 1
end
end
upto(5) do |num|
puts num
end
# 出力:
# 0
# 1
# 2
# 3
# 4
# 5
まとめ
Rubyのブロックとイテレータは、コードの再利用性と簡潔性を高めるための強力な機能です。ブロックを使用することで、一時的なコードの塊をメソッドに渡すことができます。イテレータは、コレクションを巡回し、各要素に対して処理を実行するために使用されます。これらの機能を活用することで、効率的で読みやすいコードを書くことができます。