클래스 상수에 액세스


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
흠, 나는 이전에 테스트 할 때 잘못 입력해야합니다. Ooops :)
Jeremy Smith

12
이것이 진정 상수가 되려면 값 끝에 .freeze를 추가하는 것을 잊지 마십시오! CONSTANT_NAME = ["a", "b", "c"].freeze
mutexkid

6
항상 섞어 ::.)

대문자 일 때 상황을 파악하기가 어렵습니다.)
Michael Yin

42

상수를 포함하는 클래스 내에서 추가 코드를 작성하는 경우 전역 코드처럼 취급 할 수 있습니다.

class Foo
  MY_CONSTANT = "hello"

  def bar
    MY_CONSTANT
  end
end

Foo.new.bar #=> hello

클래스 외부의 상수에 액세스하는 경우 클래스 이름 앞에 두 개의 콜론이 붙습니다.

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.