2016-09-10 4 views
2

При реализации базовой memoization в Ruby существует шаблон или простой способ вернуть memoized экземпляр var, если значение предикаты при более сложной оценке перед рукой?Оптимизация замещения базового метода с ранним возвратом

Say назначение something требует интенсивного расчета, Руби достаточно умна, чтобы вернуть переменную экземпляра, если он присутствует, или something всегда быть назначены в рамках этого метода перед установкой @some_value?

def some_value 
    @some_value if @some_value.present? # possible? 
    something = something_else.try(:method_name) || another_something.method_name # prevent this from evaluating after execution 
    @some_value ||= MyClass.new(property: something.property) 
    end 

Что было бы лучше, если бы у меня был образец memoization, чтобы реализовать то, что у меня есть?

+0

Первая строка вашего метода возвращает '@ some_value' или' nil', но поскольку это значение не фиксируется переменной, линия не имеет никакой цели. –

ответ

2

Основываясь на том, как ваш код в настоящее время написан, «интенсивный расчет» всегда будет иметь место. Ruby использует неявный возврат, если вы явно не используете ключевое слово return, поэтому, даже если присутствует @some_value, код все равно будет выполняться до последней строки.

def some_value 
    return @some_value if @some_value.present? # possible? 
    something = something_else.try(:method_name) || another_something.method_name # prevent this from evaluating after execution 
    @some_value ||= MyClass.new(property: something.property) 
end 

Так что, если вы хотите вернуть @some_value если он присутствует, и не запускать любой код после этого, вы будете хотеть использовать явное возвращение. См. Выше.

Теперь Ruby проверит наличие @some_value, и если это true, значение возвращается, в противном случае оно будет продолжено с расчетом.

+0

Doh! Спасибо за то, что вы подробно остановились на этом :) – Seth

Смежные вопросы