29

attr_accessor ile bir sınıfım varsa, varsayılan olarak ilgili alıcılar ve ayarlayıcılarla birlikte bir örnek değişkeni oluşturmaya yarar. Ancak bir örnek değişkeni oluşturmak yerine, bunun yerine bir sınıf değişkeni veya sınıf örneği değişkeni oluşturmanın bir yolu var mı? Bunun gibiRuby's attr_accessor örnek değişkenler yerine sınıf değişkenleri veya sınıf örneği değişkenleri nasıl üretebilir?

+0

"Açıkça Metaclasses Görmek" (http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html) "; Ruby'nin sınıf ve nesnelerinin çalışma şeklini anlamaya çalışırken çok yardımcı oluyor. –

cevap

46

:

class TYourClass 
    class << self 
    attr_accessor :class_instance_variable 
    end 
end 

Sen (sınıf kendisi bir örnek olduğu) sınıfının metaclass açılması ve ona bir özellik ekleyerek bu bakabilirsiniz.

attr_accessor, sınıfın Class bir yöntemidir, bu, sınıfına örnek değişkeni okuyan ve bunu ayarlayan diğer iki yöntem ekler.

class Class 
    def my_attr_accessor(name) 
    define_method name do 
     instance_variable_get "@#{name}" 
    end 
    define_method "#{name}=" do |new_val| 
     instance_variable_set "@#{name}", new_val 
    end 
    end 
end 

Tamamen denenmemiş class özelliğinin erişimci: Rails

class Class 
    def class_attr_accessor(name) 
    define_method name do 
     class_variable_get "@@#{name}" 
    end 
    define_method "#{name}=" do |new_val| 
     class_variable_set "@@#{name}", new_val 
    end 
    end 
end 
+0

Teşekkürler. Sınıfın meta sınıfını açtığını ve bir tür ek niteliği eklediğini söylemenin şeklini seviyorum. Fakat neden bir sınıf değişkeni yerine bir sınıf örneği değişkeni üretiyor? Ayrıca bir sınıf değişkeni üretmeyi de mümkün kılacak mı yoksa bu sözdizimi yalnızca sınıf örneği değişkenleri için çalışacak mı? –

+0

Farklıyım, cevaplara tekrar bakın –

+0

Bu yalnızca sınıf örneği değişkenleri için çalışacaktır, b/c attr_ * örnek değişkenler (bazı nesnelerin) için yöntemleri tanımlar. – rampion

20

(veya herhangi bir yere require 'active_support' yapmak) true sınıf değişken erişimcileri almak için cattr_accessor :name kullanabilirsiniz Burada olası bir uygulama bu.

Başkalarının işaret ettiği sınıf örneği değişkenleri genellikle daha kullanışlıdır. APIdock cattr_accessor page, biri diğerini istemediğinizi, artı kaynağın cattr_accessor, cattr_reader ve cattr_writer işlevlerini açıklayan bazı yardımcı tartışmalara sahiptir.

+0

çok daha kolay - rayların bunu teklif ettiğini bilmiyordum. Teşekkürler! –