From: Ruby Quiz Date: 2005-07-09T04:17:49+09:00 Subject: [QUIZ] SerializableProc (#38) The three rules of Ruby Quiz: 1. Please do not post any solutions or spoiler discussion for this quiz until 48 hours have passed from the time on this message. 2. Support Ruby Quiz by submitting ideas as often as you can: http://www.rubyquiz.com/ 3. Enjoy! -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= I'm a Proc addict. I use them all over the place in my code. Because of that, whenever I end up needing persistence and I call Marshal.dump() or YAML.dump() on some object hierarchy, I get to watch everything explode (since Procs cannot be serialized). This week's Ruby Quiz is to build a Proc that can be serialized. I'm not aware of any possible way to add serialization capabilities to Ruby's core Proc, which rules out a complete solution. However, even if what we build is a hack, at least one person finds it super useful. The task then is to build SerializableProc. It should support being serialized by Marshal, PStore, and YAML and otherwise behave as close to a Proc as possible. Put another way, make the following code run for your creation: require "pstore" require "yaml" code = # Build your SerializableProc here! File.open("proc.marshalled", "w") { |file| Marshal.dump(code, file) } code = File.open("proc.marshalled") { |file| Marshal.load(file) } code.call store = PStore.new("proc.pstore") store.transaction do store["proc"] = code end store.transaction do code = store["proc"] end code.call File.open("proc.yaml", "w") { |file| YAML.dump(code, file) } code = File.open("proc.yaml") { |file| YAML.load(file) } code.call