🍊

Rubyのメソッド評価について

2023/11/02に公開

Rubyのメソッドにはいくつかの評価の種類があります。
今回は、Rubyのいくつかの代表的な評価とそれに対応するメソッドについてまとめてみます。

完全評価(Eager Evaluation)

完全評価は、計算式がその場で完全に評価されることを意味します。以下は、そのような場合に使われるメソッドの例です。

# mapを使った完全評価
doubles = [1, 2, 3].map { |number| number * 2 }
puts doubles.inspect
# => [2, 4, 6]

# selectを使った完全評価
evens = (1..10).select { |number| number.even? }
puts evens.inspect
# => [2, 4, 6, 8, 10]

# reduceを使った完全評価
sum = (1..4).reduce(0) { |accum, number| accum + number }
puts sum
# => 10

これらのメソッドはリストや範囲の全要素に対して操作を適用し、その結果を即座に返します。

短絡評価(Short-Circuit Evaluation)

短絡評価は、可能な限り計算を少なくして結果を導き出す戦略です。以下は短絡評価を用いる場合の演算子の例です。

# 短絡評価の例(&&演算子)
result = false && (raise 'このコードは実行されません')
puts result
# => false

# 短絡評価の例(||演算子)
default = nil || 'デフォルト値'
puts default
# => "デフォルト値"

短絡評価を使うと、特定の条件下で不要な計算を省略できます。

遅延評価(Lazy Evaluation)

遅延評価では、計算の必要が生じるまで式の評価を遅らせます。これにより、効率的なメモリ使用や計算コストの削減が可能になります。

# 無限の範囲を遅延評価で処理し、最初の5つの偶数を取得
even_numbers = (1..Float::INFINITY).lazy.select(&:even?).first(5)
puts even_numbers.inspect
# => [2, 4, 6, 8, 10]

# 大きなファイルを遅延評価で1行ずつ処理
large_file_lines = File.foreach('big_file.txt').lazy.map(&:strip).select { |line| line.length > 100 }
# このコードではファイルはまだ読み込まれていません。必要な行が要求された時に初めて読み込まれます。

私は評価の種類があやふやで「あれ、なんでこのメソッドの部分で最後まで実行されてないんだ?」となりました。
皆さんもこの記事を参考にして適切な評価のメソッドを使用していただければと思います。

Discussion