동일한 이름의 루비 소스 파일을 처리하고 올바른 파일이 주어진 require
문으로로드되는지 확인하는 올바른 방법은 무엇입니까?Ruby 소스 파일 이름 충돌이 필요합니다.
배경
내 레일 3 응용 프로그램에 ruby-geometry 보석의 사용을 만들고 싶어.
나는 루비 - 기하의 사용을 시도하고있어 Polygon
클래스 :
NameError: uninitialized constant Geometry::Polygon
: 나는 다음과 같은 오류를 얻을이 코드를 실행하려고 할 때마다
그러나require 'geometry' # the main ruby-geometry gem file
module SomeModule
def SomeMethod(vertices)
polygon = Geometry::Polygon.new(vertices)
# Do some stuff with polygon...
end
end
, 문제없이 다른 루비 지오메트리 클래스 (예 : Geometry::Point
, Geometry::Segment
)로 작업 할 수 있기 때문에 이상합니다.
문제점
문제는 내 애플 소스 polygon.rb
라는 이름의 파일 (AN 액티브 모델을 포함) 및 so does the ruby-geometry gem이 포함되어 있다는 것입니다. 그래서 루비 - 기하학 보석 require
s its own polygon.rb
결국 내 애플 리케이션의 polygon.rb
로드 끝납니다. 아마도 이것은 루비가 디렉토리를 검색하는 순서에 이르기까지의 모든 것입니다.
이 명명 충돌을 해결하는 "적절한"방법은 무엇입니까?
코드 내에서 모듈을 사용하여 네임 스페이스를 구별하여 클래스 이름 충돌을 해결할 수 있습니다. require
-ing 할 때 동일한 이름의 소스 파일을 구별하는 간단한 방법이 있습니까?
코드 파일의 이름을 바꿀 수 있습니까? 왜 이것이 옵션이 아닌가? 그것은 그것을하는 가장 간단한 방법 일 것입니다. 이름을 'polygon_record.rb' 또는 그와 비슷한 것으로 변경하십시오. – Linuxios
그것이 옵션이라고 동의하면, 이것은 단지'require' 메카니즘이 망가 졌음을 인정하는 것처럼 보인다.소스 파일의 이름을 지정할 수 있어야하지만, 이름이 내 응용 프로그램이 의존하는 n 개의 원본 파일과 충돌하지 않도록해야합니다. 또한 충돌이 두 개의 보석 (내가 쉽게 이름을 바꿀 수없는)의 소스 파일 사이에 있다면? 더 나은 해결책이 없다고 나는 믿을 수 없다. – tomtheguvnor
정말로 모델의 이름을 바꾸고 싶지 않다면 절대 경로로 파일을 요구할 수 있습니다. 그러나 권장하지는 않습니다. –