Как смоделировать нулевой случай Rails.cache.fetch? - PullRequest
0 голосов
/ 14 декабря 2018

Рассмотрим использование

Rails.cache.fetch("key", expires_in: 2.minutes) do
  do_something_to_get_value
end

Я бы хотел поиграть с пользовательским объектом

class FakeRedis
  def initialize() @data = {} end
  def clear() @data = {} end
  def write(key, val, *args) @data[key] = val end
  def read(key, *args) @data[key] end
  def expire(key, *args) @data.delete(key) end
  def fetch(key, *args) @data[key] end
end

Для случая nil (key истекает или никогда не существует), как я могупереписать fetch, чтобы впоследствии вызвать блок кода и сохранить в @data?

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

Перепишите это так:

def fetch(key, *args) @data[key] ||= yield if block_given? end

0 голосов
/ 14 декабря 2018

Бывает, что в Ruby Hash есть хороший fetch метод, который делает почти то же самое, за исключением того, что вы должны явно установить ключ в блоке:

class FakeRedis
  def fetch(key, *, &block)
    if block
      @data.fetch(key) { |h, k| h[k] = block.call }
    else
      @data[key]
    end
  end
end
0 голосов
/ 14 декабря 2018
def fetch(key, *args)
  return(@data[key]) if @data.kas_key?(key)
  @data[key] = yield if block_given?
end

yield - метод, который будет выполнять блок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...