我在vendor/engine_name/lib/qa/qa.rb
中有一个模块,并希望扩展该模块以在单独的文件Foo
中包含一个类vendor/engine_name/lib/qa/foo.rb
,以便foo.rb
看起来像此
module QA
class Foo
# code here
end
end
当我尝试在qa.rb
中创建Foo实例时,我得到NameError
我尝试使用不同的文件路径加载foo.rb
,但它们都不起作用。如何正确扩展模块需要做什么?
答案 0 :(得分:1)
这将有效:
qa.rb:
require "./foo"
module QA
class Dog
end
end
QA::Foo.new
但是,路径./foo
是相对于您运行程序的目录,可能不是qa/
目录。
这样更好:
qa.rb:
require_relative "./foo"
module QA
class Dog
end
end
QA::Foo.new
require_relative查找包含require_relative语句的路径relative to the file
。
如果您编写require 'foo'
- 没有路径 - 那么ruby只会在某些预定义目录中搜索foo.rb,您可以通过查看输出来检查:
require "pp"
pp $LOAD_PATH
--output:--
["/Users/7stud/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0",
"/Users/7stud/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/x86_64-darwin14",
"/Users/7stud/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby",
"/Users/7stud/.rvm/rubies/ruby-2.2.1/lib/ruby/vendor_ruby/2.2.0",
"/Users/7stud/.rvm/rubies/ruby-2.2.1/lib/ruby/vendor_ruby/2.2.0/x86_64-darwin14",
"/Users/7stud/.rvm/rubies/ruby-2.2.1/lib/ruby/vendor_ruby",
"/Users/7stud/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0",
"/Users/7stud/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/x86_64-darwin14"]
您始终可以向该阵列添加目录,例如
$LOAD_PATH.unshift '/path/to/your/ruby/file/' #add to front of array
require 'your_ruby_file_name'