什么是正确的方式来处理相同名称的红宝石源文件,并确保正确的文件由给定的require
语句加载?红宝石源文件名冲突与'要求'
背景
我想利用ruby-geometry宝石在我的Rails应用程序3。
我试图利用红宝石几何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
但是,每当我尝试运行这段代码,我得到了以下错误:
NameError: uninitialized constant Geometry::Polygon
这很奇怪,因为我似乎能够在没有问题的情况下与任何其他ruby几何类一起工作(例如Geometry::Point
,Geometry::Segment
)。
的问题
的问题是,我的应用程序包含一个名为so does the ruby-geometry gem一个polygon.rb
源文件(包含ActiveRecord模型)和。所以,当红宝石几何宝石require
s its own polygon.rb
它最终加载我的应用程序的polygon.rb
而不是。据推测,这完全取决于ruby通过目录搜索的顺序。
什么是解决命名冲突的“正确”方法?
显然代码您可以使用模块来区分名称空间来解决类名称冲突。 require
-ing他们之间有一种简单的方法来区分同名的源文件吗?
你不能重命名你的代码文件吗?为什么这不是一种选择?这将是最简单的方法。重命名它'polygon_record.rb'或类似的东西。 – Linuxios 2011-12-30 17:55:22
同意这是一个选项,它似乎这样做是承认'require'机制被破坏。我应该能够命名源文件,但我希望不必确保该名称不会与我的应用所依赖的n个宝石中的任何源文件冲突。另外,如果碰撞发生在两个宝石的源文件之间(我不能轻易重命名)呢?我不相信没有更好的解决方案。 – tomtheguvnor 2011-12-30 18:08:35
我想,如果你真的不想重命名你的模型,你总是可以要求该文件的绝对路径,但我不会推荐它 – 2011-12-30 18:33:16