So, I want to define a singleton method for an object, but I want to do it using a closure.
For example,
def define_say(obj, msg) def obj.say puts msg end end o = Object.new define_say o, 'hello world!' o.say
This doesn’t work because defining a singleton method via ‘def’ is not a closure, so I get an exception that ‘msg’ is an undefined variable or method.
What I would like to do is something like using the ‘define_method’ method in the Module class, but as far as I can tell, this can only be used to define a method on a class… but I want a Singleton Method…
So, I would love to write it something like this:
def define_say(obj, msg) obj.define_singleton_method(:say) { puts msg } end
Does anyone know how I can achieve this without having to create a method to store a Proc and then use the Proc within a singleton method? (basically, I want a clean, non-hacky way of doing this)
Here’s an answer which does what you’re looking for
Usage (paste from IRB)
For more info (and a little library which makes it less messy) read this:
http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html
As an aside, If you’re a ruby programmer, and you HAVEN’T read that, go do it now~!