在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
实施我的目标会有什么更好的记忆模式?
答案 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
,则返回值,否则,它将继续计算。