Ovviamente ||=
non funzionaCome posso memoizzare un metodo che può restituire vero, falso o nulla in Ruby?
def x?
@x_query ||= expensive_way_to_calculate_x
end
perché se si scopre di essere false
o nil
, quindi expensive_way_to_calculate_x
otterrà eseguire più e più volte.
Attualmente il modo migliore che conosco è quello di mettere il valore in un Array
:
def x?
return @x_query.first if @x_query.is_a?(Array)
@x_query = [expensive_way_to_calculate_x]
@x_query.first
end
Esiste un modo più convenzionale o efficiente di fare questo?
UPDATE ho capito che volevo Memoize nil
oltre a false
- questo va tutto il viaggio di ritorno a https://rails.lighthouseapp.com/projects/8994/tickets/1830-railscachefetch-does-not-work-with-false-boolean-as-cached-value - le mie scuse a Andrew Marshall che ha dato una risposta altrimenti del tutto corretta.
Questo è ciò che 'nil' e l'intero concetto di' null' sono per. – meagar
Ho modificato la mia domanda perché non l'avevo fatto bene la prima volta, anch'io voglio memoize nil. –