2013-10-14 12 views

cevap

20

olarak aşağıda 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 ayrıca özel yöntem ve method.Your bir işe yaramadı bir sınıftır, sen örneğinde bunu aramaya çalıştı olarak C. Sizin durumunuzda #send kullanarak C numaralı telefondan arayın.

+1

kullanarak bir yöntemi dinamik olarak nasıl tanımlayabildiğimi görmeye çalışıyor. Önceki sürümümün neden yanlış olduğunu açıklar mısınız? – Bala

+1

@Bala: 'o = C.new (' krep ') 'ile sizi ob.abc', ob.pancakes',' o.abc' ve 'o.pancakes' ile geçerli yöntem çağrıları olarak bırakacağını unutmayın. . Herkesin bu olduğuna emin misin? –

+1

@muistooshort: İlginç yorum. Niyet olmamasına rağmen, şimdi ona nesneyi nasıl spesifikleştireceğimi düşünüyorum (singleton). – Bala

33

Sana define_singleton_method aradığınız şüpheli:

define_singleton_method (sembol, yöntemi) → NEW_METHOD
define_singleton_method (sembol) {blok} proc

→ a tek tanımlar alıcıda yöntem. yöntemi parametresi Proc, Method veya UnboundMethod nesnesi olabilir. Bir blok belirtilirse, yöntem gövdesi olarak kullanılır. Eğer self.class üzerinde define_method kullanırsan, sınıfın tüm örneklerini bir yöntem olarak kullanıma sunulması için

, tüm sınıfın üzerinde örnek yöntemi olarak yeni bir yöntem oluşturacağız.

Böyle define_singleton_method kullanmak:

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ı:

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

olsun istiyorum:

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ız şey bu değil. Yeni bir örnek oluşturmak ve sonuç olarak tüm sınıf değişiminin olması oldukça tuhaftır.