調べたきっかけ
プロジェクトのコードに、メモ化を行う上で「||=」と「instance_variable_defined?」を使っている部分があった。
これらの違いはなんなのか、気になったので調べてみた。
結論
||=は結果がnilだった場合はメモ化しない。
instance_variable_defined?は結果がnilでもメモ化する。
「書き方の好み」で違いが出ているのかと思ったが、上記2つのメモ化は挙動が全然違った。。
使い分け
判定に使うメソッド(in_time?みたいな)においては、falseの場合に||=だと右辺が呼ばれ続けるので、メモ化の意味をなさない。
instance_variable_defined?を使えば、falseでも結果を保持してくれるので判定メソッドでもメモ化をすることができる。