Soru Define_method, initialize () içinde nasıl kullanılır?


Kullanmaya çalışıyorum define_method içeride initialize ama undefined_method olmak define_method. Neyi yanlış yapıyorum?

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>

20
2017-10-14 20:09


Menşei


Ne yapmaya çalışıyorsun? - Sergio Tulentsev
Özel bir şey değil, bir yöntemi kullanarak dinamik olarak nasıl tanımlayabileceğimi görmeye çalışıyorum. define_method - Bala


Cevaplar:


Aşağıdaki gibi yapın:

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 bir özel yöntem ve ayrıca sınıf method.Yourunuz işe yaramadı. C. Bunu çağırmak zorundasın Ckullanılarak #send Senin durumunda.


21
2017-10-14 20:12



İşe yarıyor. Önceki sürümümün neden yanlış olduğunu açıklar mısınız? - Bala
@Bala: Dikkat et o = C.new('pancakes') seni bırakacak ob.abc, ob.pancakes, o.abc, ve o.pancakes geçerli yöntem çağrıları. Herkesin bu olduğuna emin misin? - mu is too short
@muistooshort: İlginç bir yorum. Niyet olmamasına rağmen, şimdi ona nesneyi nasıl spesifikleştireceğimi düşünüyorum (singleton). - Bala


Aradığına şüpheliyim define_singleton_method:

define_singleton_method (sembol, yöntem) → new_method
define_singleton_method (symbol) {blok} → proc

Alıcıda bir tekton metodu tanımlar. yöntem parametre bir olabilir Proc, bir Method ya da UnboundMethod nesne. Bir blok belirtilirse, yöntem gövdesi olarak kullanılır.

Eğer kullanırsan define_method üzerinde self.classtüm sınıfta örnek yöntem olarak yeni bir yöntem oluşturursunuz, böylece sınıfın tüm örneklerinde bir yöntem olarak kullanılabilir.

Kullanırsın define_singleton_method bunun gibi:

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

Ve sonra:

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'

Eğer senin initialize yaptı:

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

o zaman alırsı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'

ve muhtemelen aradığın şey değil. Yeni bir örnek oluşturmak ve sonuç olarak tüm sınıf değişiminin olması oldukça tuhaftır.


36
2017-10-14 20:39