【一人 bugs.ruby Advent Calendar 2020】[Feature #17316] On memoization【10日目】

一人 bugs.ruby Advent Calendar 2020 10日目の記事になります。

[Feature #17316] On memoization

Rubyインスタンス変数を初期化する場合、以下のように ||= 演算子を使うことが多いです。

# @foo の初期値として最初にメソッドが呼び出された時に some_heavy_calculation の結果を割り当てる
def foo
  @foo ||= some_heavy_calculation(...)
end

しかし、厳密には『 @foo が偽かどうか』ではなくて『 @foo が定義されているかどうか』で判定する必要があります。

def foo
  unless instance_variable_defined?(:foo)
    @foo = some_heavy_calculation(...)
  end
end

このような書き方は冗長であまり書きたくないのでもっと簡略化して書きたい、という旨のチケットになります。
チケットではいくつか書き方が提案されており、

instance_variable_set(:foo){ some_heavy_calculation(...) }

のように #instance_variable_set でブロックを受け取るようにしてそこに初期化処理を書くようにするとか、

memoize(:foo){ some_heavy_calculation(...) }

みたいな #memoize というヘルパメソッドを定義する、みたいな提案がされています。
機能としてはあると便利そうなんですが、書き味を考えるとどう書くのがいいのか無限にむずかしそう…。