Gibt es einen Konsens darüber, wie Memoization vermieden werden kann, die Fehler aufgrund eines veränderbaren Zustands verursacht?
In diesem Beispiel wurde der Zustand eines zwischengespeicherten Ergebnisses mutiert und gab daher beim zweiten Aufruf das falsche Ergebnis.
%Vor%Ansätze, die ich sehen kann, um dies zu vermeiden, sind:
greeting
könnte eine dup
oder clone
von @greeting_cache[formality]
zurückgeben
greeting
könnte freeze
das Ergebnis von @greeting_cache[formality]
. Das würde dazu führen, dass eine Ausnahme ausgelöst wird, wenn memoization_mutator
Strings an sie anhängt. greeting
verwendet, um sicherzustellen, dass keine Änderung der Zeichenfolge erfolgt. Gibt es einen Konsens über den besten Ansatz? Ist der einzige Nachteil der (1) oder (2) verringerte Leistung? (Ich vermute auch, dass das Einfrieren eines Objekts möglicherweise nicht vollständig funktioniert, wenn es Verweise auf andere Objekte enthält)
Randnotiz: Dieses Problem betrifft nicht die Hauptanwendung von memoization: da Fixnum
s unveränderlich sind, hat die Berechnung von Fibonacci-Sequenzen keine Probleme mit dem änderbaren Zustand. :)
Tags und Links ruby state memoization