Есть ли более чистый способ сделать это?
Вы можете назначить default_proc
для динамического вычисления недостающих значений хеш-функции:
fib = { 0 => 0, 1 => 1 }
fib.default_proc = ->(f, n) { f[n] = f[n-1] + f[n-2] }
fib[10]
#=> 55
fib
#=> {0=>0, 1=>1, 2=>1, 3=>2, 4=>3, 5=>5, 6=>8, 7=>13, 8=>21, 9=>34, 10=>55}
Обратите внимание, что этот подход ограничен размером стека Ruby.