用ruby实例化Foo?

时间:2017-10-28 22:31:15

标签: ruby class oop require instantiation

我如何instantiate Foo来自bar.rb

# foo.rb
class Foo
  def initialize
    puts "foo"
  end
end
# bar.rb
require 'foo'

Foo.new
$ ruby bar.rb 
/home/thufir/.rvm/rubies/ruby-2.4.1/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- foo (LoadError)
    from /home/thufir/.rvm/rubies/ruby-2.4.1/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from bar.rb:2:in `<main>'

目前不使用模块。在同一脚本中声明Foo时工作正常:

# bar.rb with Foo declared inside
class Foo
  def initialize
    puts "foo"
  end
end

Foo.new
$ ruby bar.rb 
foo

1 个答案:

答案 0 :(得分:3)

堆栈跟踪告诉您require 'foo'无效,因为找不到文件foo.rb

这是因为require将您提供的参数解释为绝对路径,或者在ruby加载路径中搜索指定的文件。

您可以通过提供文件的绝对路径来解决此问题。在这种情况下:require '/home/thufir/hello/foo'将适合您。

您还可以使用require_relative 'foo',它会在与foo.rb相同的目录中搜索文件bar.rb

https://ruby-doc.org/core-2.4.2/Kernel.html#method-i-require