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