通过提前返回优化基本方法记忆

时间:2016-09-10 02:45:55

标签: ruby memoization

在Ruby中实现基本的memoization时,如果值预先考虑更复杂的评估,是否有一种模式或简单的方法来返回memoized instance var?

假设something的赋值需要一个强烈的计算,Ruby是否足够聪明,如果它存在则返回实例变量,或者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

实施我的目标会有什么更好的记忆模式?

1 个答案:

答案 0 :(得分: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,则返回值,否则,它将继续计算。