【问题标题】:Including a Ruby class from a separate file从单独的文件中包含一个 Ruby 类
【发布时间】:2010-11-06 06:00:28
【问题描述】:

有一段时间我一直在 Ruby 模块中包含整个类。显然这不是我应该做的。似乎模块的重点是存储函数,然后可以将其作为方法包含在新类中。

我不想要这个。我有一个类,我想将它保存在一个单独的文件中,我可以从其他文件中访问它。我该怎么做?

谢谢。

【问题讨论】:

  • 这篇文章阐明了 require_relative 表达式,以防您在使用 Ruby >=1.9.2 Ruby require_relative example 时遇到上述示例的问题

标签: ruby class module


【解决方案1】:

模块作为函数的持有者和命名空间具有双重目的。将类保存在模块中是完全可以接受的。要将类放在单独的文件中,只需像往常一样定义该类,然后在您希望使用该类的文件中,只需将require 'name_of_file_with_class' 放在顶部即可。例如,如果我在foo.rb 中定义类Foo,在bar.rb 中我将有require 'foo' 行。

如果您使用的是 Rails,这通常会自动发生

编辑:澄清文件布局

#file: foo.rb
class Foo
  def initialize
    puts "foo"
  end
end

...

#file: bar.rb
require 'foo'

Foo.new

如果您在 Rails 中,请将这些类放在 lib/ 中,并为类名的小写下划线版本的文件使用命名约定,例如Foo -> foo.rbFooBar -> foo_bar.rb

从 ruby​​ 版本 1.9 开始,您可以使用 require_relative,要求相对于您正在编辑的文件的文件。

【讨论】:

  • 谢谢,非常有帮助。你能澄清最后一句话吗?看来您可能有错字(?)。如果类 foo 存储在 bar.rb 中,我需要 bazcontroller.rb 中的“foo”吗?那么 foo.new 可以在 bazcontroller.rb 中使用吗?
  • 也许为 Ruby 1.9 添加一些关于 'require_relative' 的信息会很好,因为该代码不适用于此版本。
  • @boutta 感谢您对 1.9 的澄清,这解决了我的问题。
  • Answer 为我保存了发言权。我在一个名为“app/lib/sendgrid_helper.rb”的文件中有一个类“SendGridHelper”,我不得不将文件名更改为“app/lib/send_grid_helper.rb”。
【解决方案2】:

您也可以使用负载。如果文件位于同一目录中,您也可以使用 require relative。阅读此链接以进一步了解:http://rubylearning.com/satishtalim/including_other_files_in_ruby.html

【讨论】:

    【解决方案3】:

    当使用 Require 时,在字符串里面指明你所引用的类的完整路径名,除非它在 ​​Ruby 的根文件夹中

    【讨论】:

      【解决方案4】:
      MyApp
      |_ app
      |_ bin
      |_ etc, etc
      root_level_file.rb
      

      你可以这样做: require './root_level_file'.

      RootLevelFile.new

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-28
        • 2011-06-30
        • 2020-03-16
        • 1970-01-01
        • 2019-08-04
        • 2011-12-25
        • 1970-01-01
        相关资源
        最近更新 更多