ブロックをオブジェクト化することのメリット
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)
上記のようにすることで、ブロックを遅延評価し、ブロックが実行されるタイミングを制御することができます。
以上のように、ブロックをオブジェクトとして扱うことで、ブロックの再利用性を高め、コードの可読性を向上し、ブロックの遅延評価を行うことができます。
ブロックの遅延評価
Discussion