我有两个名为 Person 和 Animal 的类,其中包含很多方法。我需要将这些类中的一些数据导出到CSV。我还想从类文件本身重构CSV特定代码(并将其移动到模块)。因此,我创建了名为 person / 和 animal / 的目录,并在每个目录中放入了一个csv_export.rb文件(使用CSVExport模块)。
person.rb
person/csv_export.rb
animal.rb
animal/csv_export.rb
CSV导出的数据与两个类不同,我不能只有一个常见的csv_export.rb文件(暂时)。
person.rb的例子:
class Person
include CSVExport
# numerous methods...
end
csv_export.rb示例:
module CSVExport
def to_csv
# some logic
end
end
我的问题是命名这两个模块以正确加载它们的正确方法是什么?在 Person / Animal 中要求它们的正确方法是什么(假设文件没有像Rails那样加载)?
答案 0 :(得分:2)
我会调用模块Person::CSVExport
和Animal::CSVExport
。您可以require
他们(来自每个单独的文件),如下所示:
require File.join(File.dirname(__FILE__), 'animal', 'csv_export.rb')
require File.join(File.dirname(__FILE__), 'person', 'csv_export.rb')
这不适用于irb
内部(至少在我正在运行的Ruby 1.9.2p290中),但如果从文件运行Ruby程序,它确实有效。
你提出了一个很好的观点;如果你在animal/csv_export.rb
的顶部加载(例如)animal.rb
,那么Animal
是一个未定义的常量。你可以这样解决这个问题:
class Animal
module CSVExport
# contents
end
end
请注意,如果可以,更好的方法可能是为自己构建一些低级实用程序方法,这样可以在更高的抽象级别编写CSV导出逻辑,并使代码足够短到进入animal.rb
和person.rb
而不会压倒他们。我不知道这些实用程序究竟是什么;我必须看到代码提供具体的建议。