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>
I suspect that you're looking for define_singleton_method
:
define_singleton_method(symbol, method) → new_method
define_singleton_method(symbol) { block } → procDefines a singleton method in the receiver. The method parameter can be a
Proc
, aMethod
or anUnboundMethod
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With