Forum: Ruby Getting existing context when defining a singleton method (c

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Roland S. (Guest)
on 2007-01-06 20:30
(Received via mailing list)
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
unknown (Guest)
on 2007-01-19 17:30
(Received via mailing list)
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
Roland S. (Guest)
on 2007-09-26 00:37
(Received via mailing list)
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
unknown (Guest)
on 2007-09-26 00:52
(Received via mailing list)
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
This topic is locked and can not be replied to.