UFO ET IT

성가신 "경고 : 이미 초기화 된 상수"메시지에 대한 솔루션

ufoet 2020. 11. 23. 20:40
반응형

성가신 "경고 : 이미 초기화 된 상수"메시지에 대한 솔루션


오늘 저는 Ruby 상수와 관련된 까다로운 문제를 발견했습니다. 우리 팀에서는 누군가가 여러 모델에 포함 된 모듈을 만들었습니다. (사양) 테스트 출력에서 ​​다음과 같은 경고 메시지가 나타납니다.

/home/ayrton/project/lib/life_cycle.rb:5 : 경고 : 이미 초기화 된 상수 RESET

이를 해결하는 한 가지 방법은 다음과 같이 상수를 선언하는 것입니다.

module LifeCycle

  unless (const_defined?(:RESET))
    RESET = 'reset'
  end

  #...
end

또한 대안 솔루션 을 제공하는 Avdi Grimm이 작성한 블로그 게시물을 읽었습니다 .이 문제에 대한 귀하의 의견이 무엇인지 궁금합니다.


오늘도 이와 동일한 문제가 발생하여 간단한 해결책을 찾았습니다.

경고는 동일한 값을 가진 상수를 다시 할당하려는 것이므로 방금 변경했습니다.

module LifeCycle
  RESET = 'reset'
end

...에

module LifeCycle
  RESET ||= 'reset'
end

이것은 경고를 처리했으며 각 상수가 정의되었는지 확인하는 것보다 훨씬 간단합니다. 더 나은 해결책을 찾으면 알려주세요.


이것은 Rails 애플리케이션과 같이 명시 적으로 다시로드되는 애플리케이션에서만 문제가됩니다.

자세한 내용이 불쾌하다면 unless대신 문 수정 자로 사용할 수 있습니다 .

module LifeCycle
  RESET = 'reset' unless const_defined?(:RESET)
end

이것은 메서드 만 사용하라는 Avdi의 제안에 대한 몇 가지 약한 주장을 남깁니다.

  • 상수 조회는 메소드 조회보다 빠릅니다.
  • 상수 값은 (첫 번째) 요청이 아닌로드시 정의됩니다.
  • 상수는 파생하는 데 작업이 필요하지 않음을 시각적으로 암시합니다.

이를 무시할만큼 Avdi의 제안이 마음에 들면 그대로 사용하십시오.


RESET은 코드에서 계속 변경되는 경우 상수가 아닙니다. 소문자 '재설정'으로 이름을 바꾸면 문제가 사라집니다. Ruby는 대문자 변수가 상수라고 생각하므로 상수가 변경되었음을 경고하는 오류를 표시합니다.


Intellij IDE에서이 오류가 발생했습니다. 대문자로 시작하는 변수 이름이 선언 되었기 때문입니다. 소문자로 만들면이 문제가 해결됩니다 ..

참고 URL : https://stackoverflow.com/questions/7953611/solutions-to-the-annoying-warning-already-initialized-constant-message

반응형