2016-04-27 35 views
5

içine dahil edilmiştir. İçinde bulundukları bir modülde çeşitli sınıflar içinde tutulan sabitlere erişmeye çalışıyorum. modül için mantık sadece her sınıfta aynı kalır adı olan sabiti (bakınız edebilmek istiyorum birden fazla sınıfta paylaşılır gibi temel bir örnekRuby: Bir modülün bir sabit diske nasıl erişileceği bir modül

module foo 
    def do_something_to_const 
    CONSTANT.each { ... do_something ... } 
    end 
end 

class bar 
    include foo 

    CONSTANT = %w(I want to be able to access this in foo) 
end 

class baz 
    include foo 

    CONSTANT = %w(A different constant to access) 
end 

ama içindekiler gibi farklılık göstermek). Bunu yaparken nasıl giderim?

cevap

3

ile self.class olarak ve kullanım const_get ya da sadece self.class::CONST içine dahil edilen ikinci olmak biraz daha hızlı:

module M 
    def foo 
    self.class::CONST 
    end 
end 

class A 
    CONST = "AAAA" 
    include M 
end 

class B 
    CONST = "BBBB" 
    include M 
end 

puts A.new.foo # => AAAA 
puts B.new.foo # => BBBB 
+1

Teşekkürler @Vasfed tam olarak aradığımızı tam olarak –

+0

Yansıma kullanmanıza gerek yok. Yansıma olmadan 'self.class :: CONST' kullanabilirsiniz. –

+0

@ JörgWMittag haklısınız ve% 2-9 daha hızlı, güncellenmiş cevap – Vasfed

0

:: işleci, CONSTANT kapsamını BAR sınıfına genişletmek için kullanabilirsiniz. Sözdizimi şu şekilde görünecektir: Bununla birlikte, bundan kaçınmaya çalışırdım. Eklenen modül, dahil edildiği sınıfın uygulama ayrıntılarını bilmeye gerek duymamalıdır.

Sen sınıf modülünü başvurabilir
+0

Burada bahsettiğiniz konu, modülün ne içerdiği için uygulamayı bilmemesi gerekiyor. Aynı modülü birçok sınıfta kullanıyorum ve bu şekilde yapamadım. Açık olması için orijinal kod örneğini genişletirim. –

1

Sen ile sınıfını başvurabilir self.class

module Foo 
    def do_something 
    self.class::Constant.each {|x| puts x} 
    end 
end 

class Bar 
    include Foo 
    Constant = %w(Now is the time for all good men) 
end 

class Baz 
    include Foo 
    Constant = %w(to come to the aid of their country) 
end 

bar = Bar.new 
bar.do_something 
=> 
Now 
is 
the 
time 
for 
all 
good 
men 
=> ["Now", "is", "the", "time", "for", "all", "good", "men"] 

baz = Baz.new 
baz.do_something 
=> 
to 
come 
to 
the 
aid 
of 
their 
country 
=> ["to", "come", "to", "the", "aid", "of", "their", "country"] 
İlgili konular