Search code examples
rubyclassooprequireinstantiation

instantiate Foo with ruby?


How do I instantiate Foo from 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>'

Not using modules at the moment. Works fine when Foo is declared inside the same script:

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

Foo.new
$ ruby bar.rb 
foo

Solution

  • The stack trace is telling you that your require 'foo' is not working because it can't find the file foo.rb.

    That is because require interprets the argument you give it as an absolute path, or it searches your ruby load path for the specified file.

    You could resolve this by providing an absolute path to the file. In this case: require '/home/thufir/hello/foo' will work for you.

    You could also use require_relative 'foo', which will search for a file foo.rb in the same directory as your bar.rb.

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