Ruby 将代码重构为子目录
我有两个类叫做Person和Animal,其中有很多方法。我需要将这些类中的一些数据导出到CSV。我还想从类文件本身重构特定于CSV的代码(并将其移动到模块)。因此,我创建了名为person/和animal/的目录,并在每个目录中放置了一个csv_export.rb文件(带有一个CSVExport模块) CSV导出的数据对于这两个类来说是完全不同的,所以我不能只有一个通用的CSV_export.rb文件(目前) person.rb的示例:Ruby 将代码重构为子目录,ruby,refactoring,gem,Ruby,Refactoring,Gem,我有两个类叫做Person和Animal,其中有很多方法。我需要将这些类中的一些数据导出到CSV。我还想从类文件本身重构特定于CSV的代码(并将其移动到模块)。因此,我创建了名为person/和animal/的目录,并在每个目录中放置了一个csv_export.rb文件(带有一个CSVExport模块) CSV导出的数据对于这两个类来说是完全不同的,所以我不能只有一个通用的CSV_export.rb文件(目前) person.rb的示例: class Person include CSVEx
class Person
include CSVExport
# numerous methods...
end
csv_export.rb示例:
module CSVExport
def to_csv
# some logic
end
end
我的问题是,为这两个模块命名名称以便它们正确加载的正确方法是什么?在Person/Animal中需要它们的正确方式是什么(假设文件不是通过Rails加载的)?我会调用模块
Person::CSVExport
和Animal::CSVExport
。您可以这样要求它们(从每个单独的文件中):
class Animal
module CSVExport
# contents
end
end
require File.join(File.dirname(\uuuuu File\uuuuuu)、'animal'、'csv\u export.rb')
require File.join(File.dirname(\uuuuu File\uuuuuu)、'person'、'csv\u export.rb')
从内部irb
(至少在我正在运行的Ruby 1.9.2p290中是这样),这是不起作用的,但如果Ruby程序是从文件运行的,它确实起作用
你说得很好;如果在animal.rb
顶部加载(例如)animal/csv\u export.rb
,则此时animal
是一个未定义的常数。你可以这样绕过它:
class Animal
module CSVExport
# contents
end
end
请注意,如果可以的话,更好的方法可能是为自己构建一些低级实用程序方法,这样可以在更高的抽象级别上对CSV导出逻辑进行编码,并使代码足够短,以便在不压倒它们的情况下进入animal.rb
和person.rb
。我不知道这些实用程序究竟是什么;我必须查看代码才能提供具体的建议。文件顶部的require标记不太有效(在class Person
之前)。由于它试图加载模块Person::CSVExport
,但尚未加载Person,因此Person在该点上是一个未初始化的常量。需要类块中的文件合适吗?@russianbandit,谢谢你指出我的错误。我刚刚编辑了我的答案。嗯,做class->module的把戏似乎也不管用。我在ruby 1.8.7上得到了“类动物的超类不匹配(TypeError)”。似乎动物已经在CSVXEXPORT.RB中定义,并且不能在Inimal.Rb中再次定义,您的要求行不考虑CSVXEXPORT.RB位于动物/目录内。谢谢你的帮助!修正了一个问题。为了解决另一个问题,你需要告诉我动物的超类应该是什么。