Wie vermeide ich Memoization, die Fehler in Ruby verursacht?

8

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:

  1. greeting könnte eine dup oder clone von @greeting_cache[formality] zurückgeben
  2. 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.
  3. Überprüfen Sie den gesamten Code, der das Ergebnis von 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. :)

    
Andrew Grimm 13.01.2011, 01:37
quelle

2 Antworten

4

Ich würde mich darauf konzentrieren, ein geklontes Objekt zurückzugeben. Der Leistungseinbruch beim Erstellen einer neuen Zeichenfolge ist so gut wie nichts. Ein Einfrieren macht Implementierungsdetails verfügbar.

    
zaius 13.01.2011, 08:22
quelle
0

Ich bin immer noch 'Ruby Newbie', und ich weiß nicht, ob Sie sich über den Unterschied zwischen '& lt; & lt;' und '+' Methoden zu einem String.

%Vor%     
OldBoy 09.10.2014 10:37
quelle

Tags und Links