Mengakses konstanta kelas

142

Ketika saya memiliki yang berikut:

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

  ...
end

Apakah ada cara untuk mengakses Foo::CONSTANT_NAMEatau apakah saya harus membuat metode kelas untuk mengakses nilai?

Jeremy Smith
sumber

Jawaban:

244

Apa yang Anda poskan harus bekerja dengan sempurna:

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

Foo::CONSTANT_NAME
# => ["a", "b", "c"]
Dylan Markow
sumber
2
Hmm, saya pasti salah ketik ketika saya tes sebelumnya. Ooops :)
Jeremy Smith
12
Agar ini benar-benar konstan, jangan lupa untuk menambahkan .freeze di akhir nilai! CONSTANT_NAME = ["a", "b", "c"].freeze
mutexkid
6
Selalu campur aduk ::dan .;)
Nick
Hal-hal sulit dikenali saat dituliskan dalam huruf besar;)
Michael Yin
42

Jika Anda menulis kode tambahan di dalam kelas Anda yang berisi konstanta, Anda bisa memperlakukannya seperti global.

class Foo
  MY_CONSTANT = "hello"

  def bar
    MY_CONSTANT
  end
end

Foo.new.bar #=> hello

Jika Anda mengakses konstanta di luar kelas, awali dengan nama kelas, diikuti oleh dua titik dua

Foo::MY_CONSTANT  #=> hello
maček
sumber
42

Beberapa alternatif:

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"
bantu
sumber
17

Apakah ada cara untuk mengakses Foo::CONSTANT_NAME?

Ya ada:

Foo::CONSTANT_NAME
Jörg W Mittag
sumber
Ketika saya mencoba mengaksesnya, saya memiliki peringatan di bawah ini. peringatan: konstanta sudah diinisialisasi TestData :: CONSTANT_VAR Variabel ini tidak diinisialisasi di tempat lain. Kenapa saya mendapat peringatan ini?
ASM