【问题标题】:Ruby Struggling including/requiring relative modulesRuby Struggling 包括/需要相关模块
【发布时间】:2016-02-21 04:42:14
【问题描述】:

我正在阅读这份 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(这似乎不起作用)。

ruby 版本是“ruby 1.9.3p194(2012-04-20 修订版 35410)[x86_64-linux]”

如何解决此错误并让演示正常工作?

感谢您提前提供的任何帮助。

【问题讨论】:

    标签: ruby


    【解决方案1】:

    requirerequire_relative 加载指定文件中的代码并执行。为了让 Greeter 存在于 Person.rb 中,您需要 require 定义 Greeter 的文件。 requires 通常应该放在文件的顶部,而不是在类或方法中。

    include 获取给定模块中的方法并将它们添加到您调用include 的类中。但是如果你没有required 定义它的文件,你就不能include Greeter

    换句话说,你需要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 使用该对象。

    这是另一种思考方式。假设你有这两个文件:

    常量.rb

    Message = "Hello, world!"
    

    greet.rb

    #!/usr/bin/env ruby
    puts Message
    

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

    greet2.rb

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

    运行 greet2.rb 现在将打印消息“Hello, world!”

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

    【讨论】:

    • 谢谢!有用!现在仔细看看为什么。如果我理解正确,则包含假定您已经拥有 Greeter。这是否意味着我可以多次包含同一个模块,但只要我先用 require/require_relative 加载它?有点像sn-p?
    • 是的,没错。我已经用一些附加信息更新了我的答案,希望能帮助你理解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多