initialize
内でdefine_method
を使用しようとしていますが、undefined_method define_method
を取得しています。私は何が間違っているのですか?
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>
以下のようにしてください:
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
はプライベートメソッドであり、クラスでもあります-)メソッド。C
のインスタンスで呼び出そうとしたため、機能しませんでした。あなたの場合は#send
を使用して、C
で呼び出す必要があります。
あなたが探しているのではないかと思います define_singleton_method
:
define_singleton_method(symbol、method)→new_method
define_singleton_method(symbol){ブロック}→procレシーバーでシングルトンメソッドを定義します。 methodパラメーターは、
Proc
、Method
、またはUnboundMethod
オブジェクトにすることができます。ブロックが指定されている場合、それはメソッド本体として使用されます。
define_method
で self.class
を使用する場合は、クラス全体のインスタンスメソッドとして新しいメソッドを作成し、のすべてのインスタンスでメソッドとして使用できるようにします。クラス。
次のようにdefine_singleton_method
を使用します。
class C
def initialize(s)
define_singleton_method(s) { puts "some method #{s}" }
end
end
その後:
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'
initialize
が行った場合:
self.class.send(:define_method,n) { puts "some method #{n}" }
次に、次のようになります。
a.a # puts 'some method a'
a.b # puts 'some method b'
b.a # puts 'some method a'
b.b # puts 'some method b'
そしてそれはおそらくあなたが探しているものではありません。新しいインスタンスを作成し、その結果としてクラス全体を変更するのはかなり奇妙です。