Ruby

Rubyのブロックとイテレータについて解説

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には、eachmapselectなどのさまざまなイテレータが用意されています。

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のブロックとイテレータは、コードの再利用性と簡潔性を高めるための強力な機能です。ブロックを使用することで、一時的なコードの塊をメソッドに渡すことができます。イテレータは、コレクションを巡回し、各要素に対して処理を実行するために使用されます。これらの機能を活用することで、効率的で読みやすいコードを書くことができます。

スポンサーリンク

-Ruby