Como posso memorizar um método que pode retornar true, false ou nil em Ruby?
Obviamente||=
não vai funcionar
def x?
@x_query ||= expensive_way_to_calculate_x
end
porque se acaba por serfalse
ounil
, entãoexpensive_way_to_calculate_x
vai ser executado mais e mais.
Atualmente, a melhor maneira que eu conheço é colocar o valor em umArray
:
def x?
return @x_query.first if @x_query.is_a?(Array)
@x_query = [expensive_way_to_calculate_x]
@x_query.first
end
Existe uma maneira mais convencional ou eficiente de fazer isso?
ATUALIZAR Eu percebi que queria fazer memoizenil
além defalse
- Isso vai todo o caminho de volta parahttps://rails.lighthouseapp.com/projects/8994/tickets/1830-railscachefetch-dois-not-work-with-false-boolean-as-cached-value - minhas desculpas paraAndrew Marshall que deu uma resposta completamente correta.