# Re-define class method

**URL:** <https://www.ruby-forum.com/t/re-define-class-method/98212>\
**Category:** Ruby\
**Created:** [July 13, 2006, 4:59am UTC](https://www.ruby-forum.com/t/re-define-class-method/98212 "2006-07-13T04:59:20Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![crucoba](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/e8c25b/32.png) [@crucoba](https://www.ruby-forum.com/u/crucoba)\
**Post date:** [July 13, 2006, 4:59am UTC](https://www.ruby-forum.com/t/re-define-class-method/98212/1 "2006-07-13T04:59:20Z")

</div>

I’ve got the following:

module ClassMethods  
def class\_method  
“Class method”  
end  
end

class Thing  
extend ClassMethods  
end

Thing.class\_method  
=\> “Class method”

… and I want to change the behaviour of that method at runtime. I  
tried this:

Thing.send(:define\_method, :class\_method, lambda{ “replaced” })

… but I still get this:

Thing.class\_method  
=\> “Class method”

Am I close? What’s the right way to do this?

Thanks,  
David

---

<div class="post-metadata">

**Author:** ![crucoba](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/e8c25b/32.png) [@crucoba](https://www.ruby-forum.com/u/crucoba)\
**Post date:** [July 13, 2006, 5:11am UTC](https://www.ruby-forum.com/t/re-define-class-method/98212/2 "2006-07-13T05:11:55Z")

</div>

On Jul 12, 2006, at 9:58 PM, David C. wrote:

> end
> 
> Thing.class\_method  
> =\> “Class method”
> 
> Am I close? What’s the right way to do this?

OK - I’ve discovered that I can do this:

Thing.class.send(:define\_method, :other\_method, lambda{ “other” })  
Thing.other\_method  
=\> “other”

and even redefine it:

Thing.class.send(:define\_method, :other\_method, lambda{ “other  
redefined” })  
Thing.other\_method  
=\> “other redefined”

but if I try this:

Thing.class.send(:define\_method, :class\_method, lambda{ “replaced” })  
Thing.class\_method  
=\> “Class method”

So it looks like I can replace class methods that I define at  
runtime, but not the ones that were defined at load-time. Is that  
correct? Am I missing a step?

Thanks,  
David

---

<div class="post-metadata">

**Author:** ![crucoba](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/e8c25b/32.png) [@crucoba](https://www.ruby-forum.com/u/crucoba)\
**Post date:** [July 13, 2006, 12:27pm UTC](https://www.ruby-forum.com/t/re-define-class-method/98212/3 "2006-07-13T12:27:06Z")

</div>

Well, I discovered the solution, thanks to our friend google, and got  
a much better understanding of singleton classes (though the fog  
hasn’t completely dissipated). For anyone interested:

thing\_singleton\_class = class \<\< Thing; self; end  
thing\_singleton\_class.send(:define\_method, :class\_method, proc  
{ “replaced” })

Thing.class\_method  
=\> “replaced”

Cheers,  
David

---

<div class="post-metadata">

**Author:** ![crucoba](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/e8c25b/32.png) [@crucoba](https://www.ruby-forum.com/u/crucoba)\
**Post date:** [July 13, 2006, 12:36pm UTC](https://www.ruby-forum.com/t/re-define-class-method/98212/4 "2006-07-13T12:36:16Z")

</div>

Hi –

On Thu, 13 Jul 2006, David C. wrote:

> Well, I discovered the solution, thanks to our friend google, and got a much  
> better understanding of singleton classes (though the fog hasn’t completely  
> dissipated). For anyone interested:
> 
> thing\_singleton\_class = class \<\< Thing; self; end  
> thing\_singleton\_class.send(:define\_method, :class\_method, proc { “replaced”  
> })
> 
> Thing.class\_method  
> =\> “replaced”

Don’t forget that you can do this much more concisely (unless you have  
a specific need to go the long way round):

def Thing.class\_method  
“replaced”  
end

David

---

<div class="post-metadata">

**Author:** ![crucoba](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/e8c25b/32.png) [@crucoba](https://www.ruby-forum.com/u/crucoba)\
**Post date:** [July 13, 2006, 1:26pm UTC](https://www.ruby-forum.com/t/re-define-class-method/98212/5 "2006-07-13T13:26:42Z")

</div>

Hi –

On Thu, 13 Jul 2006, David C. wrote:

> > 
> 
> to stick w/ the more cryptic version. Unless you have a different suggestion
> 
> - I’m just getting my head wrapped around metaprogramming and singleton  
> classes, so all suggestions are most welcome.

There’s an intermediate version, which might be usable depending on  
how much you know in advance:

class \<\< Thing  
def class\_method  
“replaced”  
end  
end

When you need a less concise version, because you’re determining  
things more dynamically, I would personally tend to use class\_eval and  
define\_method without send:

meth = “class\_method”  
l = lambda { “replaced” }  
(class \<\< Thing; self; end).class\_eval { define\_method(meth,&l) }

And hopefully we’ll eventually have a Kernel#singleton\_class method to  
make it all a little neater 🙂

David

---

<div class="post-metadata">

**Author:** ![crucoba](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/e8c25b/32.png) [@crucoba](https://www.ruby-forum.com/u/crucoba)\
**Post date:** [July 13, 2006, 1:14pm UTC](https://www.ruby-forum.com/t/re-define-class-method/98212/6 "2006-07-13T13:14:15Z")

</div>

On Jul 13, 2006, at 5:33 AM, removed\_email\_address@domain.invalid wrote:

> a specific need to go the long way round):
> 
> def Thing.class\_method  
> “replaced”  
> end

Thanks David. I definitely appreciate the conciseness of this, and  
will use that when I know the type. The problem I’m working on  
requires a solution to replacing singleton methods on arbitrary types  
at runtime, so I think I have to stick w/ the more cryptic version.  
Unless you have a different suggestion - I’m just getting my head  
wrapped around metaprogramming and singleton classes, so all  
suggestions are most welcome.

Thanks,  
David

---

<div class="post-metadata">

**Author:** ![crucoba](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/e8c25b/32.png) [@crucoba](https://www.ruby-forum.com/u/crucoba)\
**Post date:** [July 13, 2006, 2:48pm UTC](https://www.ruby-forum.com/t/re-define-class-method/98212/7 "2006-07-13T14:48:24Z")

</div>

On 7/13/06, David C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > 
> 
> at runtime, so I think I have to stick w/ the more cryptic version.  
> Unless you have a different suggestion - I’m just getting my head  
> wrapped around metaprogramming and singleton classes, so all  
> suggestions are most welcome.
> 
> Thanks,  
> David

You can use David’s method like this:

def redefine\_method\_for(klass)  
def klass.class\_method  
“replaced”  
end  
end

redefine\_method\_for Thing

p Thing.class\_method  
#=\> “replaced”

Regards,  
Sean

---

<div class="post-metadata">

**Author:** ![crucoba](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/e8c25b/32.png) [@crucoba](https://www.ruby-forum.com/u/crucoba)\
**Post date:** [July 13, 2006, 2:01pm UTC](https://www.ruby-forum.com/t/re-define-class-method/98212/8 "2006-07-13T14:01:07Z")

</div>

On Jul 13, 2006, at 6:24 AM, removed\_email\_address@domain.invalid wrote:

> meth = “class\_method”  
> l = lambda { “replaced” }  
> (class \<\< Thing; self; end).class\_eval { define\_method(meth,&l) }

Excellent! Much cleaner.

Thanks,  
David

---

<div class="post-metadata">

**Author:** ![crucoba](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/e8c25b/32.png) [@crucoba](https://www.ruby-forum.com/u/crucoba)\
**Post date:** [July 13, 2006, 4:03pm UTC](https://www.ruby-forum.com/t/re-define-class-method/98212/9 "2006-07-13T16:03:09Z")

</div>

On Jul 13, 2006, at 7:47 AM, Sean O’Halpin wrote:

> You can use David’s method like this:  
> #=\> “replaced”  
> Unfortunately (actually, rather fortunately 😉 ), both the class and  
> the method name are determined at run time. David’s dynamic  
> suggestion (elsewhere in this thread) is working quite well.

Cheers, and thanks for the help!

David
