我正在阅读本指南,用于编程Ruby: https://newcircle.com/bookshelf/ruby_tutorial/modules
我完全按照他们的建议写出来,并将两个文件(" Greeter.rb"," Person.rb")放在同一个文件夹中。
以下是文件:
Greeter.rb :
#!/usr/bin/ruby
module Greeter
def greet
puts "Hello!"
end
end
Person.rb :
#!/usr/bin/ruby
class Person
include Greeter
end
alice = Person.new
alice.greet
尝试运行时出现以下错误" ruby Person.rb":
Person.rb:4:in `<class:Person>': uninitialized constant Person::Greeter (NameError)
from Person.rb:3:in `<main>'
我尝试查找错误,以及如何加载相对路径模块, 等等。
我尝试过使用include,require和require_relative(似乎没有用)。
红宝石版本是&#34; ruby 1.9.3p194(2012-04-20修订版35410)[x86_64-linux]&#34;
如何解决此错误并使演示工作?
提前感谢您的帮助。
答案 0 :(得分:3)
require
和require_relative
将代码加载到指定文件中并执行它。为了使Greeter存在于Person.rb
中,您需要require
定义Greeter的文件。 require
通常应位于文件的顶部,而不是在类或方法中。
include
获取给定模块中的方法,并将它们添加到您调用include
的类中。但是,如果您没有include Greeter
定义其定义的文件,则无法require
。
换句话说,您需要require
(或require_relative
)和include
:
#!/usr/bin/ruby
require_relative "./Greeter.rb"
class Person
include Greeter
end
alice = Person.new
alice.greet
在Ruby中,类和模块是任何其他对象。如果定义对象的代码没有运行,则无法告诉Ruby对某个对象执行某些操作。 require
告诉Ruby加载和运行定义Greeter的代码,include
,在这种情况下,是告诉Ruby使用该对象的。
这是考虑它的另一种方式。假设您有这两个文件:
Message = "Hello, world!"
#!/usr/bin/env ruby
puts Message
greet.rb
引发一个名为uninitialized constant Message.
的NameError,你可能不会感到惊讶。我们在另一个Message
无法了解的文件中定义了greet.rb
。我们必须先告诉Ruby加载它:
#!/usr/bin/env ruby
require_relative "./constants.rb"
puts Message
正在运行greet2.rb
将打印消息&#34; Hello,world!&#34;
您的Greeter和我的消息之间的唯一区别是Greeter是一个模块而Message是一个字符串。