Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use define_method inside initialize()

Trying to use define_method inside initialize but getting undefined_method define_method. What am I doing wrong?

class C   def initialize(n)         define_method ("#{n}") { puts "some method #{n}" }       end end  C.new("abc") #=> NoMethodError: undefined method `define_method' for #<C:0x2efae80> 
like image 374
Bala Avatar asked Oct 14 '13 20:10

Bala


2 Answers

I suspect that you're looking for define_singleton_method:

define_singleton_method(symbol, method) → new_method
define_singleton_method(symbol) { block } → proc

Defines a singleton method in the receiver. The method parameter can be a Proc, a Method or an UnboundMethod object. If a block is specified, it is used as the method body.

If you use define_method on self.class, you'll create the new method as an instance method on the whole class so it will be available as a method on all instances of the class.

You'd use define_singleton_method like this:

class C   def initialize(s)         define_singleton_method(s) { puts "some method #{s}" }       end end 

And then:

a = C.new('a') b = C.new('b') a.a # puts 'some method a' a.b # NoMethodError b.a # NoMethodError b.b # puts 'some method b' 

If your initialize did:

self.class.send(:define_method,n) { puts "some method #{n}" }     

then you'd get:

a.a # puts 'some method a' a.b # puts 'some method b' b.a # puts 'some method a' b.b # puts 'some method b' 

and that's probably not what you're looking for. Creating a new instance and having the entire class change as a result is rather odd.

like image 160
mu is too short Avatar answered Oct 04 '22 04:10

mu is too short


Do as below :

class C   def initialize(n)         self.class.send(:define_method,n) { puts "some method #{n}" }       end end  ob = C.new("abc") ob.abc # >> some method abc 

Module#define_method is a private method and also a class method.Your one didn't work,as you tried to call it on the instance of C.You have to call it on C,using #send in your case.

like image 28
Arup Rakshit Avatar answered Oct 04 '22 03:10

Arup Rakshit