从单独的文件中包含一个 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.rb
、FooBar
-> 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 类的主要内容,如果未能解决你的问题,请参考以下文章
需要 rspec 中包含 ruby 文件的整个文件夹 [重复]