2010-09-29 4 views
11

Ich habe einen Hash mit einem Standard-Proc, den ich in eine Datei marschieren möchte, aber das Standard-Proc verhindert, dass ich das tue.Marshal Ruby Hash mit Standard-Proc - entfernen Sie die Standard-proc?

Anstatt meine eigenen _dump und _load Methoden zu schreiben, ist es stattdessen möglich, stattdessen die Standard-Proc zu entfernen? An dem Punkt, an dem ich Marshalling bin, brauche ich nie wieder den Standard-Proc.

Antwort

14

zurückgesetzt einfach den Standard:

h.default = nil 

Deutlicher ausgedrückt:

def dumpable_hash(h) 
    return h unless h.default_proc 
    copy = h.clone 
    copy.default = nil # clear the default_proc 
    copy 
end 

In Ruby 2.0, Sie can auch h.default_proc = nil schreiben, wenn Sie es vorziehen. Verfügbar für alle Rubine mit require 'backports/2.0.0/hash/default_proc'.

+1

Es stellte sich heraus 'h.default = nil' löscht die Standard-proc - das ist alles, was ich brauchte. Vielen Dank! –

+0

Es ist auch möglich, Hashes mit einem Standardwertobjekt wie 'Hash.new (42)' zu dumpen. Nicht dass ich gerne Standardwerte habe, außer sie sind unveränderlich. –

5

Falls Sie eine Kopie ohne Ausfälle haben wollen, die einfachste Art und Weise -

Hash[hash_with_defaults]