성가신 "경고 : 이미 초기화 된 상수"메시지에 대한 솔루션
오늘 저는 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에서이 오류가 발생했습니다. 대문자로 시작하는 변수 이름이 선언 되었기 때문입니다. 소문자로 만들면이 문제가 해결됩니다 ..
'UFO ET IT' 카테고리의 다른 글
Mockito : 일반 매개 변수로 확인 (0) | 2020.11.23 |
---|---|
별도의 부분 문자열을 만들지 않고 C- 문자열의 특정 부분 만 인쇄 할 수 있습니까? (0) | 2020.11.23 |
프로덕션에서 Entity Framework (코드 우선) 마이그레이션 사용 (0) | 2020.11.23 |
localStorage를 사용할 수 있는지 확인 (0) | 2020.11.23 |
libz.so.1 : 공유 객체 파일을 열 수 없습니다. (0) | 2020.11.23 |