Как использовать кеш в ruby - PullRequest
0 голосов
/ 03 ноября 2019

Мне нужна помощь, чтобы понять, как работает этот код. Я новичок в программировании на Ruby. Может кто-нибудь объяснить мне, как работает @cache в Ruby?

Я получил этот код из Интернета.

require 'Benchmark'
time = Benchmark.realtime do
    @cache = {}; @cache[1] = 1; @cache[2] = 1

        n = 49
        def fibonacci(n)
            @cache[n] ||= fibonacci(n-1) + fibonacci(n-2)
        end
    puts "#{n}'s fibonacci value is #{fibonacci(n)}"
end
    puts "Time elapsed #{time} seconds"

Ответы [ 2 ]

2 голосов
/ 03 ноября 2019

Помимо крайне нерегулярного использования ; для объединения нескольких операторов в одной строке и объявления метода внутри блока, это довольно типичный код 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

Часть блока здесь является обработчиком по умолчанию для неизвестных ключей и запускается при обращении к ключу, который не существует. Это позволяет вам заполнить ключ любым желаемым значением.

Эта форма довольно минимальна и выполняет функции как вычисления, так и кэша.

0 голосов
/ 03 ноября 2019

Предыдущий ответ дает хорошее объяснение того, что делает код и как лучше его реорганизовать. Чтобы расширить это, @cache - это просто переменная экземпляра , которая в данном примере названа семантически. Ruby по большей части не волнует, как вы называете свои переменные. Тем не менее, это хорошее соглашение по программированию использовать семантические имена (они говорят вам что-то о предполагаемом назначении объекта). В приведенном вами примере мы видим, что переменная экземпляра создает объект Hash.

@cache = {} # is the same as doing @cache = Hash.new
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...