필자가 작성한 일부 코드와 충돌하는 최상위 클래스를 정의하는 보석을 감안할 때, 모든 클래스가 모듈 내에 그룹화되는 방식으로 보석을 요구할 수 있습니까? 내가 정의 할 수 있니? 예를 들어, unsafe_gem는 클래스를 정의하는 경우 :Ruby gem을 사용자 정의 네임 스페이스에로드하십시오.
class Word
# ... some code
end
내가 좋아하는 뭔가를해야합니다 :
Word.new # => The class I defined.
SafeContainer::Word.new # => The class defined by the gem.
일부 자세한 내용 : 그래서 구별 할 수
class Word
# My word class.
end
module SafeContainer
# This obviously doesn't work
# (i.e. the gem still defines ::Word).
require 'unsafe_gem'
end
을 사이 내 코드 (예 : 'Word'클래스)는 이미 자체 네임 스페이스에 래핑되어 있습니다. 그러나 최상위 네임 스페이스 아래에서 일부 클래스를 직접 액세스 할 수 있도록 "구문 설탕"형식을 사용하도록 사용자에게 옵션을 제공 할 수 있기를 바랍니다. 그러나 이것은 최상위 클래스를 정의하는 사용하고있는 보석 중 하나와 이름 충돌을 일으 킵니다. 보석이 실제로 거기에있는 세계적으로 정의 된 클래스에 실제로 의존하기 때문에 현재 제안 된 솔루션 중 어느 것도 작동하지 않습니다. 클래스를 정의 해제하면 보석이 깨집니다. 물론,이 보석은 하나 이상의 파일을 가지고 있으며 모듈에 파일을 개별적으로 요구하는 것은 매우 취약한 해결책으로 보인다. 현재 내가 찾은 유일한 해결책은 다음과 같습니다.
begin
# Require the faulty gem.
require 'rbtagger'
rescue
# If syntactic sugar is enabled...
if NAT.edulcorated?
# Temporarily remove the sugar for the clashing class.
Object.const_unset(:Word); retry
else; raise; end
ensure
# Restore syntactic sugar for the clashing class.
if NAT.edulcorated?
Object.const_set(:Word, NAT::Entities::Word)
end
end
왜 그런지 모르지만 내 발톱이 말려 있습니다. 누구보다 나은 해결책이 있습니까?