Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 将代码重构为子目录_Ruby_Refactoring_Gem - Fatal编程技术网

Ruby 将代码重构为子目录

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

我有两个类叫做Person和Animal,其中有很多方法。我需要将这些类中的一些数据导出到CSV。我还想从类文件本身重构特定于CSV的代码(并将其移动到模块)。因此,我创建了名为person/和animal/的目录,并在每个目录中放置了一个csv_export.rb文件(带有一个CSVExport模块)

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加载的)?

我会调用模块
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位于动物/目录内。谢谢你的帮助!修正了一个问题。为了解决另一个问题,你需要告诉我动物的超类应该是什么。