Hi
I’m fairly new to this “meta-programming” thing, so excuse me if I get
my terminology wrong. Is there any way of getting access to the
exisiting context when using class << obj or otherwise creating a
singleton method?
For example of what I mean - I have a method that returns a Proc:
def foo()
local_var = “Bar”
Proc.new { local_var }
end
x = foo()
x.call --> returns “Bar”, ‘remembering’ the local context
and I want to something similar with methods defined using class <<
obj:
class MyObject
end
def foo(my_object_instance)
local_var = “Bar”
class << my_object_instance
define_method(:a_method) { local_var }
end
end
o = MyObject.new
foo(o)
o.a_method --> throws an error, complaining about missing local
variable
If I just wanted to assign this method to the class then I think I
could do the following in foo:
my_object_instance.class.send(:define_method, :a_method) { local_var }
But I want to define a singleton method, and I don’t think you can get
access to an object instance’s virtual class in a similar way?
Any help with this much appreciated,
TIA
Roland
Hi –
On Sun, 7 Jan 2007, Roland S. wrote:
Hi
I’m fairly new to this “meta-programming” thing, so excuse me if I get
my terminology wrong. Is there any way of getting access to the
exisiting context when using class << obj or otherwise creating a
singleton method?
Yes:
sclass = (class << obj; self; end)
sclass.class_eval do
define_method …
end
That will keep you in the local scope you started in.
Hopefully there will be a method in Ruby 1.9/2.0 that will let you
grab an object’s singleton class, so you could do:
obj.singleton_class.class_eval # etc.
David
Great!
Yes:
Thanks for the (very speedy) response.
Hopefully there will be a method in Ruby 1.9/2.0 that will let you
grab an object’s singleton class, so you could do:
obj.singleton_class.class_eval # etc.
I guess you can have this in ruby 1.8 by doing
class Object
def singleton_class
class << self
self
end
end
end
Some code that I’ve seen around is now much clearer… thanks again.
Cheers,
Roland
Hi –
On Sun, 7 Jan 2007, Roland S. wrote:
I guess you can have this in ruby 1.8 by doing
class Object
def singleton_class
class << self
self
end
end
end
Yes, many of us have had occasion to write exactly that 
Some code that I’ve seen around is now much clearer… thanks again.
Glad to help!
David