クラスの定数にアクセスする


142

次の場合:

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

  ...
end

にアクセスする方法はありますFoo::CONSTANT_NAMEか、または値にアクセスするためにクラスメソッドを作成する必要がありますか?

回答:


244

あなたが投稿したものは完璧に機能するはずです:

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

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

2
うーん、以前テストしたときはタイプミスしたに違いない。おっと:)
ジェレミー・スミス

12
これが本当に一定であるためには、値の最後に.freezeを追加することを忘れないでください!CONSTANT_NAME = ["a", "b", "c"].freeze
mutexkid

6
常に混同し::てください.;)
Nick

大文字の場合、物事を見つけるのは難しい;)
マイケルイン

42

定数を含むクラス内で追加のコードを記述している場合、それをグローバルのように扱うことができます。

class Foo
  MY_CONSTANT = "hello"

  def bar
    MY_CONSTANT
  end
end

Foo.new.bar #=> hello

クラス外の定数にアクセスしている場合は、クラス名の前に2つのコロンを付けてください。

Foo::MY_CONSTANT  #=> hello

42

いくつかの選択肢:

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

アクセスする方法はありますFoo::CONSTANT_NAMEか?

はいあります:

Foo::CONSTANT_NAME

アクセスしようとすると、以下の警告が表示されます。警告:すでに初期化された定数TestData :: CONSTANT_VARこの変数は他の場所では初期化されていません。なぜ私はこの警告を受けているのですか?
ASM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.