Getting existing context when defining a singleton method (c

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 :slight_smile:

Some code that I’ve seen around is now much clearer… thanks again.

Glad to help!

David

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs