显然||=
行不通
def x?
@x_query ||= expensive_way_to_calculate_x
end
因为如果结果是false
or nil
,那么expensive_way_to_calculate_x
就会一遍又一遍地运行。
目前我知道的最好的方法是将值放入Array
:
def x?
return @x_query.first if @x_query.is_a?(Array)
@x_query = [expensive_way_to_calculate_x]
@x_query.first
end
有没有更传统或更有效的方法来做到这一点?
更新我意识到我想记住nil
除了false
- 这一直追溯到https://rails.lighthouseapp.com/projects/8994/tickets/1830-railscachefetch-does-not-work-with-false-boolean -as-cached-value - 我向Andrew Marshall道歉,他给出了一个完全正确的答案。