Не совсем. Существует оператор (||=
), который присваивает значение только в том случае, если левый операнд является ложным (nil
или false
). Обычно использование этого с переменной экземпляра делает трюк.
Memoist и Memoizable - драгоценные камни, которые часто используются для этой цели.
Но я предполагаю, что ваш вопрос более общий - как вы реализуете декораторы методов в рубине?
class Module
def decorate(method_name, &decoration)
undecorated_method = instance_method(method_name)
define_method(method_name) do
decoration.call(&undecorated_method.bind(self))
end
end
def memoize(method_name)
@values ||= {}
decorate(method_name) do |&evaluator|
unless @values.key?(method_name)
@values[method_name] = evaluator.call
end
@values[method_name]
end
end
end
class SuperComputer
memoize def answer
puts "Pending... 7½ million years remaining."
42
end
end
deep_mind = SuperComputer.new
deep_mind.answer # => 42 (and prints)
deep_mind.answer # => 42 (doesn't print)
В настоящее время существует много лучших от этой реализации (арг, kwargs, блоки, каждый экземпляр запоминания, и т.д.), но это должно дать вам общее представление о том, как декораторы могут быть реализованы без необходимость внесения изменений в язык.
Является ли модуль для memoization в python действительно называемым 'lazy'? Это было бы просто неправильно ... – ndn
@ndn, не совсем. «Ленькая оценка - это стратегия оценки, которая задерживает оценку выражения до тех пор, пока его значение не понадобится, а также избегает повторных оценок» https://en.wikipedia.org/wiki/Lazy_evaluation –
После стольких лет это первый раз Я слышу * «избегает повторных оценок» * как часть определения. Человек каждый день узнает что-то новое. Тем не менее, я думаю, что это немного вводит в заблуждение. Почему бы не использовать однозначную * memoize *? – ndn