2014-09-01 11 views
2

Ruby 1.8.7에있는 Rails 앱에서 데코레이터로 구현 된 특정 클래스가 있습니다. 나는 계속 경고를 받는다 - warning: already initialized constant ABC. 여기서 ABC는 상수의 이름입니다.상수가 이미 Ruby 클래스에 정의되어 있는지 확인하는 올바른 방법

이 문제를 해결하기 위해이 answer에 제안 된대로 const_defined? 메서드를 사용하고 있습니다.

내 생각 엔 const_defined? 루비에서 클래스 상수가 이미 정의되어 있는지 확인하는 올바른 방법입니까? 모듈 상수를 확인하는 데 사용할 수 있음을 분명히 알 수 있습니다.

answer에서 언급 한대로 defined? 방법을 사용할 수도 있음을 알게되었습니다. defined?의 설명서를 찾으려고했지만 지금까지 내 검색을 기반으로하는 설명서에 대한 링크가 표시되지 않습니다.

이 두 가지 중에서 분명히 다른 점을 알 수 없으므로 둘 중 어느 것을 선택해야할지 모르겠습니다.

이 상황에서 어떤 것이 가장 좋고, 왜 사용해야하는지 제안 해주십시오.

+0

: 이와 같은 경우를 들어

module M def self.const_missing sym; 42 end end M.const_defined? "A" #=> false M::A #=> 42 

을, 당신은 begin ... rescue ... end 문을 사용할 수 있습니다 도움이 될 수 있습니다. http://stackoverflow.com/q/3398590/477037 – Stefan

답변

2

키워드 defined?here으로 문서화되어 있습니다.

상수인지 확인하는 것이 더 좋으며 상수 인 것이 중요하면 const_defined?을 사용하십시오. 당신 만이 정의되어 있는지 걱정 경우에는 루비가 유일한 옵션이 const_defined? 외모 1.8.7 사용하고 있기 때문에 내가 defined?

의 경우에서 어떤 문서를 찾을 수 없기 때문에, 다음, 키워드 defined?

+0

답해 주셔서 감사합니다. 저는 Ruby 1.8.7을 사용하고 있습니다.이 루비 버전이있는 경우 해당 설명서를 알려주십시오. const_defined를 사용하고 계십니까? 클래스 내의 메소드가 문제가되지 않아야합니까? 나는 그것이 작동하는지 알지만이 질문을하는 이유는 const_defined입니까? 더 많은 것은 모듈보다 클래스와 함께 사용하는 것과 비슷하지만 [ 'Module'관련 문서] (http://ruby-doc.org/core-1.8.7/Module-tmlconst_defined -3F), 나는 약간의 의문을 가지고 있었다. 친절하게 확인할 수 있습니까? 감사. – boddhisattva

+0

@boddhisattva, Ruby 1.8.7을 사용하지 마십시오. 구식입니다. 나쁘다는 뜻입니다. Ruby 2.x를 사용하십시오. –

+1

@BorisStitnicky :이 사람들은 어디에서 * 루비 1.8을 얻을까요? 내가 아는 한 모든 주요 배포판이 업데이트되었습니다. 심지어 OSX! –

0

를 사용 우리는 Ruby 1.9를 사용하고 있습니다. 정의 된 것을 사용하도록 제안하겠습니까? 자세한 내용은 this document을 확인하십시오.

+1

'defined? '는 메소드가 아니기 때문이다. 연산자와 비슷한 키워드입니다. –

0

하나 이상의 옵션이 있습니다. 루비는이 성가신 #const_missing 방법을 가지고 있기 때문에, 그 예기치 않게도 거기 #const_defined?거짓 나타냅니다 어디에 가치를 제공 할 수있다 이것은 :

begin 
    M::A; true 
rescue NameError 
    false 
end 
#=> true