[prev in list] [next in list] [prev in thread] [next in thread]
List: ruby-talk
Subject: Re: Dynamically creating class methods
From: "David A. Black" <dblack () rubypal ! com>
Date: 2009-06-30 21:42:43
Message-ID: alpine.LFD.2.00.0906301737060.14178 () rubypal ! com
[Download RAW message or body]
Hi --
On Wed, 1 Jul 2009, Shak Shak wrote:
> I want to create a class method which allows us to create further class
> methods, so something like:
>
> class Test
> class << self
> def create_method(name, proc)
> self.class.send(:define_method, name, proc)
> end
> end
> end
>
> proc = lambda {puts 'Hello world'}
> Test.create_method(:foo, proc)
> Test.foo #want this
> Integer.foo #don't want this
>
> The problem with the above is that create_method adds foo to all
> classes. self.send on its own doesn't seem to do what I want - it adds
> foo as instance method instead.
There are three candidates for the class to which you might send the
:define_method message:
1. Test
2. Class
3. the singleton class of Test
#3 is the one you want. The code you've written sends the message to
Class, and the self.send that you've tried sends it to Test.
Try this:
class Test
def self.create_method(name, proc)
s_class = class << self; self; end
s_class.send(:define_method, name, proc)
end
end
There are other ways (including using class_eval), but that's the
general idea.
David
--
David A. Black / Ruby Power and Light, LLC
Ruby/Rails consulting & training: http://www.rubypal.com
Now available: The Well-Grounded Rubyist (http://manning.com/black2)
"Ruby 1.9: What You Need To Know" Envycasts with David A. Black
http://www.envycasts.com
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic