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?
cevap
:
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
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ı? –
Farklıyım, cevaplara tekrar bakın –
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
(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.
çok daha kolay - rayların bunu teklif ettiğini bilmiyordum. Teşekkürler! –
"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. –