나는 날짜가 바뀔 때마다 루비 파일을 추출하는 루비 코드를 돌리고있다. 파일에서, 나는 다음과 같은 기능을 가지고 싶습니다 물론, 그들은 통역이 원치 않는 때마다 경고 "이미 일정 초기화"를 표시하게,경고없이 Ruby 상수를 재정의하는 방법은 무엇입니까?
Tau = 2 * Pi
추천하고, 일정한 정의를, 그래서 :
Tau = 2 * Pi unless defined?(Tau)
을하지만 우아하고 약간 젖은 (안 DRY) :
def_if_not_defined(:Tau, 2 * Pi)
redef_without_warning(:Tau, 2 * Pi)
이 같은 내 모든 상수 정의를 작성하여 경고를 피할 수 있습니다.
더 좋은 방법이 있습니까 def_if_not_defined
? 그리고 어떻게 redef_without_warning
에?
- 스티브에
솔루션 덕분에 :
class Object
def def_if_not_defined(const, value)
mod = self.is_a?(Module) ? self : self.class
mod.const_set(const, value) unless mod.const_defined?(const)
end
def redef_without_warning(const, value)
mod = self.is_a?(Module) ? self : self.class
mod.send(:remove_const, const) if mod.const_defined?(const)
mod.const_set(const, value)
end
end
A = 1
redef_without_warning :A, 2
fail 'unit test' unless A == 2
module M
B = 10
redef_without_warning :B, 20
end
fail 'unit test' unless M::B == 20
-
이 질문은 오래되었습니다. 위 코드는 Ruby 1.8에서만 필요합니다. Ruby 1.9에서 P3t3rU5의 대답은 경고를 표시하지 않고 단순히 더 나은 것입니다.
왜 상수를 다시 정의 하시겠습니까? 자신의 클래스 나 모듈에 네임 스페이스 상수를 유지하는 것이 더 좋습니다. 이렇게하면 다른 상수와 충돌하지 않게됩니다. –
자동 상수 코드 재 로더를 사용하지 않는 것처럼 자연스럽게 상수를 사용하기 때문에 상수를 다시 정의해야하므로 "상수를 사용하지 마십시오"라는 대답을 받아들이지 않을 것입니다. –
'타우 = 2 * 파이가 정의되지 않았다면 (타우)'에 관해서는 무엇이 비천하고 DRY가 아닌가? – jrdioko