Bir sınıfın sabitlerine erişme


142

Aşağıdakilere sahip olduğumda:

class Foo
   CONSTANT_NAME = ["a", "b", "c"]

  ...
end

Erişmenin bir yolu var mı Foo::CONSTANT_NAMEveya değere erişmek için bir sınıf yöntemi yapmak zorunda mıyım?

Yanıtlar:


244

Gönderdikleriniz mükemmel bir şekilde çalışmalıdır:

class Foo
  CONSTANT_NAME = ["a", "b", "c"]
end

Foo::CONSTANT_NAME
# => ["a", "b", "c"]

2
Hmm, daha önce test ettiğimde yanlış yazmış olmalıydım. Ooops :)
Jeremy Smith

12
Bunun gerçekten sabit olması için, değerin sonuna bir .freeze eklemeyi unutmayın! CONSTANT_NAME = ["a", "b", "c"].freeze
mutexkid

6
Her zaman karıştır ::ve .;)
Nick


42

Sınıfınızda sabiti içeren ek kod yazıyorsanız, bunu global gibi değerlendirebilirsiniz.

class Foo
  MY_CONSTANT = "hello"

  def bar
    MY_CONSTANT
  end
end

Foo.new.bar #=> hello

Sabitin sınıfın dışına erişiyorsanız, bunu sınıf adının önüne ve ardından iki sütunun önüne ekleyin

Foo::MY_CONSTANT  #=> hello

42

Bazı alternatifler:

class Foo
  MY_CONSTANT = "hello"
end

Foo::MY_CONSTANT
# => "hello"

Foo.const_get :MY_CONSTANT
# => "hello"

x = Foo.new
x.class::MY_CONSTANT
# => "hello"

x.class.const_defined? :MY_CONSTANT
# => true

x.class.const_get :MY_CONSTANT
# => "hello"

17

Erişmenin bir yolu var mı Foo::CONSTANT_NAME?

Evet var:

Foo::CONSTANT_NAME

Ben erişmeye çalıştığımda, aşağıdaki uyarı yaşıyorum. uyarı: zaten başlatılmış sabit TestData :: CONSTANT_VAR Bu değişken başka hiçbir yerde başlatılmaz. Neden bu uyarıyı alıyorum?
ASM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.