Reputation: 2428
I'm trying to learn how to program with Ruby and I want to create separate files for separate classes, but when I do I get the following message:
NameError: uninitialized constant Book
const_missing at org/jruby/RubyModule.java:2677(root) at /Users/Friso/Documents/Projects/RubyApplication1/lib/main.rb:1
However, it works if I put the class directly into the main file. How can I solve this?
Main code:
book1 = Book.new("1234", "Hello", "Ruby")
book2 = Book.new("4321", "World", "Rails")
book1.to_string
book2.to_string
Class code:
class Book
def initialize(isbn,title,author)
@book_isbn=isbn
@book_title=title
@book_author=author
end
def to_string
puts "Title: #@book_title"
puts "Author: #@book_author"
puts "ISBN: #@book_isbn"
end
end
Upvotes: 21
Views: 46664
Reputation: 1674
In order to include classes, modules, etc into other files you have to use require_relative
or require
(require_relative
is more Rubyish.) For example this module:
module Format
def green(input)
puts"\e[32m#{input}[0m\e"
end
end
Now I have this file:
require_relative "format" # <= require the file
include Format # <= include the module
def example
green("this will be green") # <= call the formatting
end
The same concept goes for classes:
class Example
attr_accessor :input
def initialize(input)
@input = input
end
def prompt
print "#{@input}: "
gets.chomp
end
end
example = Example.new(ARGV[0])
And now I have the main file:
require_relative "class_example"
example.prompt
In order to call any class, or module from another file, you have to require it.
I hope this helps, and answers your question.
Upvotes: 30
Reputation: 4970
You need to instruct the Ruby runtime to load the file that contains your Book class. You can do this with require
or require_relative
.
The latter is better in this case, because it loads the file relative to the directory in which the file containing the require
is specified. Since that's probably the same directory, you can just require_relative
the file name, without the .rb
extension by convention.
You can google 'require vs require_relative ruby' to find out more about the differences.
Upvotes: 12