Помимо крайне нерегулярного использования ;
для объединения нескольких операторов в одной строке и объявления метода внутри блока, это довольно типичный код Ruby. @cache
- это просто имя переменной экземпляра.
Это позволяет избежать повторения вычислений путем кэширования результатов предыдущих запусков. Поскольку алгоритм Фибоначчи здесь рекурсивный, это экономит много дублируемой работы.
Хотя это действительно не тот способ структурировать код Ruby. Подобные методы не должны зависеть от глобальных переменных. Вычислительный класс Фибоначчи, который делает это, не будет сложнее и будет легче следовать:
class Fibonacci
def initialize
@cache = {
1 => 1,
2 => 2
}
end
def compute(n)
@cache[n] ||= compute(n-1) + compute(n-2)
end
end
Fibonacci.new.compute(11)
# => 144
Более продвинутый способ решения этой проблемы состоит в использовании функции Ruby в Hash, где он может вычислять новые значения. для неизвестных ключей:
fibonacci = Hash.new do |h, k|
h[k] = h[k-1] + h[k-2]
end.merge(1 => 1, 2 => 2)
fibonacci[11]
# => 144
Часть блока здесь является обработчиком по умолчанию для неизвестных ключей и запускается при обращении к ключу, который не существует. Это позволяет вам заполнить ключ любым желаемым значением.
Эта форма довольно минимальна и выполняет функции как вычисления, так и кэша.