# Define\_method issue

**URL:** <https://www.ruby-forum.com/t/define-method-issue/146338>\
**Category:** Ruby\
**Created:** [August 20, 2008, 4:24am UTC](https://www.ruby-forum.com/t/define-method-issue/146338 "2008-08-20T04:24:51Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![dorelal](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/3da27b/32.png) [@dorelal](https://www.ruby-forum.com/u/dorelal)\
**Post date:** [August 20, 2008, 4:24am UTC](https://www.ruby-forum.com/t/define-method-issue/146338/1 "2008-08-20T04:24:51Z")

</div>

Based on the following example should I conclude whether I use  
instance\_eval or class\_eval, define\_method always creates an instance  
method.

class Music  
end

Music.instance\_eval do  
define\_method :jazz do  
puts ‘i am jazz’  
end  
end

Music.class\_eval do  
define\_method :rock do  
puts ‘i am rock’  
end  
end

Music.jazz rescue puts ‘Music.jazz failed’  
Music.rock rescue puts ‘Music.rock failed’  
Music.new.jazz rescue puts ‘Music.new.jazz failed’  
Music.new.rock rescue puts ‘Music.new.rock failed’

output is:  
Music.jazz failed  
Music.rock failed  
i am jazz  
i am rock

---

<div class="post-metadata">

**Author:** ![dorelal](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/3da27b/32.png) [@dorelal](https://www.ruby-forum.com/u/dorelal)\
**Post date:** [August 20, 2008, 4:55am UTC](https://www.ruby-forum.com/t/define-method-issue/146338/2 "2008-08-20T04:55:32Z")

</div>

From: Raj S. [[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)]

# Based on the following example should I conclude whether I use

# instance\_eval or class\_eval, define\_method always creates an instance

# method…

Hi Raj,  
you may need to access Music’s meta/eigenclass in order to define a  
singleton for it.

eg, in ruby 1.8.6 latest stable

irb(main):044:0\> def add\_class\_method(c, m, &b)  
irb(main):045:1\> eigenclass = class \<\< c; self; end  
irb(main):046:1\> eigenclass.class\_eval {  
irb(main):047:2\* define\_method(m, &b)  
irb(main):048:2\> }  
irb(main):049:1\> end  
=\> nil  
irb(main):050:0\>  
irb(main):051:0\* add\_class\_method(Music, :rock2) do  
irb(main):052:1\* puts ‘i am a rock, too :)’  
irb(main):053:1\> end  
=\> #Proc:0x028c6c00@:51(irb)  
irb(main):054:0\> Music.rock2  
i am a rock, too 🙂  
=\> nil  
irb(main):056:0\> [RUBY\_VERSION,RUBY\_PATCHLEVEL,RUBY\_RELEASE\_DATE,  
RUBY\_PLATFORM  
]  
=\> [“1.8.6”, 286, “2008-08-08”, “i386-mswin32”]

in 1.9, it is much simpler

irb(main):002:0\> class Music  
irb(main):003:1\> end  
=\> nil  
irb(main):004:0\> Music.define\_singleton\_method(:rock) do  
irb(main):005:1\* puts “i am a classy rock”  
irb(main):006:1\> end  
=\> #\<Proc:0xe033dc@(irb):5 (lambda)\>  
irb(main):007:0\> Music.rock  
i am a classy rock  
=\> nil  
irb(main):008:0\> RUBY\_VERSION  
=\> “1.9.0”

kind regards -botp
