从单独的文件中包含一个 Ruby 类

Posted

技术标签:

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

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

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

谢谢。

【问题讨论】:

这篇文章阐明了 require_relative 表达式,以防您在使用 Ruby >=1.9.2 Ruby require_relative example 时遇到上述示例的问题 【参考方案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

【讨论】:

以上是关于从单独的文件中包含一个 Ruby 类的主要内容,如果未能解决你的问题,请参考以下文章

从 Ruby 中包含的文件中访问变量

在 Flash 中包含所有类文件

需要 rspec 中包含 ruby​​ 文件的整个文件夹 [重复]

如何在单独的 js 文件中使用访问 django 模板变量,而不是在同一个 html 文件中包含小脚本块?

在 C++ 中包含来自单独文件夹的文件

在 Sandcastles 的单独文件中包含代码示例