web-dev-qa-db-ja.com

initialize()内でdefine_methodを使用する方法

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>
27
Bala

以下のようにしてください:

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で呼び出す必要があります。

25
Arup Rakshit

あなたが探しているのではないかと思います define_singleton_method

define_singleton_method(symbol、method)→new_method
define_singleton_method(symbol){ブロック}→proc

レシーバーでシングルトンメソッドを定義します。 methodパラメーターは、ProcMethod、またはUnboundMethodオブジェクトにすることができます。ブロックが指定されている場合、それはメソッド本体として使用されます。

define_methodself.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'

そしてそれはおそらくあなたが探しているものではありません。新しいインスタンスを作成し、その結果としてクラス全体を変更するのはかなり奇妙です。

41
mu is too short