Ruby苦苦挣扎包括/需要相关模块

时间:2016-02-21 04:42:15

标签: ruby

我正在阅读本指南,用于编程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;

如何解决此错误并使演示工作?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

requirerequire_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使用该对象的。

这是考虑它的另一种方式。假设您有这两个文件:

constants.rb

Message = "Hello, world!"

greet.rb

#!/usr/bin/env ruby
puts Message

greet.rb引发一个名为uninitialized constant Message.的NameError,你可能不会感到惊讶。我们在另一个Message无法了解的文件中定义了greet.rb。我们必须先告诉Ruby加载它:

greet2.rb

#!/usr/bin/env ruby
require_relative "./constants.rb"
puts Message

正在运行greet2.rb将打印消息&#34; Hello,world!&#34;

您的Greeter和我的消息之间的唯一区别是Greeter是一个模块而Message是一个字符串。