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?

Jawaban:


244

Apa yang Anda poskan harus bekerja dengan sempurna:

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

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

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

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"

17

Apakah ada cara untuk mengakses Foo::CONSTANT_NAME?

Ya ada:

Foo::CONSTANT_NAME

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.