2013-02-17 27 views
7

:Sınıf << kendini ne anlama geliyor? İlgili

class Test 
    class << self 
    def hi 
     puts "Hi there" 
    end 
end 

kafamda görüntü aşağıdaki ile geldi: her şey bu yana

Ruby bir nesnedir sınıfların kendileri sınıfın Class nesneleridir. class << self numaralı telefonu arayarak Test'un içinden Class tanımını açıp birkaç örnek yöntemi enjekte edersiniz. Test, Class örneğidir, bu yöntemleri, nesnelerinizde örnek yöntemlerini çağırdığınız şekilde çağırabilirsiniz: Test.hi.

class Class 
    def hi 
     puts “Hi there” 
    end 
end 

Test = Class.new(class Test 
end) 
Test.hi 

Bunu doğru muyum:

önceki cümle görselleştirmek için yardımcı sahte kod aşağıdadır?

cevap

4

A sınıfının obj nesnesinin olduğunu varsayalım. ne yapar class << obj; ... end

[A, ...] 

kimin tek örneği obj olan bir sınıf B oluşturur ve atası böylece obj atası hiyerarşisinde koyar: Bu noktada, obj 'ın sınıfının atası hiyerarşisi obj 'ın sınıfının hiyerarşisi olur:

[B, A, ...] 

Eğer Test kapsamında class << self; ... end yazarsanız, o zaman vücut olan tek örneğiolan bir sınıf olacak. Bu gövde içinde bir örnek yöntemi hi tanımlarsanız, o zaman bu sınıfın örnekleri için geçerli olacaktır, bu Test. Böylece Test.hi yapabileceksiniz.

+0

Öyleyse söylediğiniz şey, temelde 'Sınıf' değiştirmek yerine, 'Sınıf' ve "hi" yönteminin tanımladığı ve "Test" nesnesinin sınıfı olan anonim bir sınıf oluşturur. – spacemonkey

+0

Evet. Bu doğru. – sawa

+0

Sonunda bunu kırmak güzel. Teşekkür ederim! – spacemonkey