😝

ブロックをオブジェクト化することのメリット

2023/04/10に公開

rubyのブロックについて学習しているときに、ブロックを使用する理由が気になり、自分なりにブロック化することのメリットをまとめてみました。よかったらご参考に。

ブロック(block) とは?

メソッドの呼び出しの際に引数と一緒に渡すことができる do~endや{ }などで表現された処理のかたまりのこと。
 

ブロックをオブジェクト化することのメリット

 
1.ブロックの再利用性を高めることができる

ブロックをオブジェクトとして扱うことで、同じブロックを複数の場所で使い回すことができます。例えば、以下のようなコードを考えてみましょう。

array1 = [1, 2, 3, 4, 5]
array2 = [6, 7, 8, 9, 10]

# array1とarray2の要素をそれぞれ2倍して足し合わせる
result1 = array1.map { |n| n * 2 }.reduce(&:+)
result2 = array2.map { |n| n * 2 }.reduce(&:+)

このコードでは、 map メソッドで配列の要素を2倍してから、 reduce メソッドで足し合わせています。しかし、同じ処理を複数の場所で行う必要がある場合、同じブロックを複数回書く必要があります。このような場合に、ブロックをオブジェクトとして扱うことで、ブロックを変数に代入して使い回すことができます。

array1 = [1, 2, 3, 4, 5]
array2 = [6, 7, 8, 9, 10]

# 2倍するブロックをオブジェクト化する
double = Proc.new { |n| n * 2 }

# array1とarray2の要素をそれぞれ2倍して足し合わせる
result1 = array1.map(&double).reduce(&:+)
result2 = array2.map(&double).reduce(&:+)

このようにすることで、同じブロックを複数回書く必要がなくなり、コードの可読性が向上します。
 
 
2.コードの可読性を高めることができる

ブロックをオブジェクトとして扱うことで、コードの可読性を向上することができます。例えば、以下のようなコードを考えてみましょう。

users = User.all
sorted_users = users.sort_by { |u| u.name.downcase }

このコードでは、 sort_by メソッドにブロックを渡して、 name カラムを大文字小文字を区別せずにソートしています。

しかし、ブロックが長くなってしまい、可読性が低下しています。このような場合に、ブロックをオブジェクトとして扱うことで、ブロックの名前を付けることができ、コードの可読性を向上することができます。

users = User.all
sort_by_name = Proc.new { |u| u.name.downcase }
sorted_users = users.sort_by(&sort_by_name)

このようにすることで、ブロックの名前を付けて、コードの可読性を向上することができます。
 
 
3.ブロックを遅延評価することができる

ブロックをオブジェクトとして扱うことで、ブロックを遅延評価することができます。遅延評価とは、ブロックが実行されるタイミングを後にずらすことを指します。例えば、以下のようなコードを考えてみましょう。

def foo(&block)
  puts "foo"
  block.call
end

foo { puts "bar" }

このコードでは、foo メソッドにブロックを渡しています。しかし、ブロックは foo メソッドが呼び出されると同時に実行されます。このような場合に、ブロックをオブジェクトとして扱うことで、ブロックを遅延評価することができます。

def foo(&block)
  puts "foo"
  block.call if block_given?
end

bar = Proc.new { puts "bar" }
foo(&bar)

上記のようにすることで、ブロックを遅延評価し、ブロックが実行されるタイミングを制御することができます。

以上のように、ブロックをオブジェクトとして扱うことで、ブロックの再利用性を高め、コードの可読性を向上し、ブロックの遅延評価を行うことができます。

ブロックの遅延評価

https://magazine.techacademy.jp/magazine/19922

Discussion