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.

questionAnswers(2)

yourAnswerToTheQuestion