【问题标题】:include module in ruby在 ruby​​ 中包含模块
【发布时间】:2009-12-26 18:05:16
【问题描述】:

我是 ruby​​ 的初学者,我搜索了是否有人问过类似的问题但找不到任何问题。所以我在这里问。

我正在尝试使用 ruby​​ 中的模块。

我创建了一个文件夹项目

在 Project 文件夹中,创建了一个类 One

class Project::One

  include Project::Rest

end 

在 Project 文件夹中,创建了一个模块 Rest

module Project::Rest

 def display
   puts "in display"
 end

end

但是当我尝试运行程序时(ruby one.rb)我得到了

未初始化的常量项目(NameError)

请帮帮我

【问题讨论】:

  • 仅供参考,当您对答案感到满意时,应将其标记为已接受。

标签: ruby


【解决方案1】:

问题是您从未真正定义过Project 常量。您必须先定义它,然后才能使用它。示例:

# root.rb
module Project
end
require "project/test"

# project/test.rb
class Project::Test
end

然后您应该能够运行ruby root.rb。另一种方法是在命名空间中声明模块。

# root.rb
require "project/test"

# project/test.rb
module Project
  class Test
  end
end

在此示例中,您也可以运行 ruby project/test.rb,因为该文件中定义了 Project 模块。

如果您有多个文件定义Project 模块,那也不是问题。它不会被重新定义,它永远是同一个模块。

这两种方法都将定义Project 模块。但是,简单地使用Project::Test 不会定义模块。

顺便说一句,Rails 有一个自动加载器。如果您在 Rails 应用程序中,并使用特定的文件夹结构,则会为您定义这些类型的中间模块。但是,如果没有 Rails,您必须自己定义它们。

【讨论】:

  • 感谢您的回复...现在我明白我做错了什么...您的旁注非常有帮助,因为我在 Rails 应用程序中看到了同样的工作
  • 这个答案是正确的。但是,以下两个答案也是正确的,并且可能更符合问题中给出的示例。否决米帕迪和亚历克斯的答案的人能否解释原因?我认为他们自工作以来得分为负是误导性的,区别主要在于样式和应用程序布局(从问题中不清楚)。
  • 反对票来自我。我实际上试图撤回它们,因为我得出了与您相同的结论,但是为时已晚。显然,您只能在投票后不久撤回投票。
【解决方案2】:

问题是您没有正确嵌套类/模块。您必须使用module 关键字声明一个模块,而不仅仅是写class Project::Class。假设你有这个结构:

Project/
    one.rb
    rest.rb

那么您的文件应该如下所示:

# one.rb
require 'rest'

module Project
  class One
    include Project::Rest
  end
end

# rest.rb
module Project
  module Rest
    def display
      puts 'in display'
    end
  end
end

请注意这些示例中的模块是如何嵌套的。

【讨论】:

    【解决方案3】:

    如果您在多个文件中有代码,则必须先加载这些文件,然后才能访问其中的内容。这通常通过require 语句完成。我认为你想要做的应该是这样的:

    # one.rb
    require 'rest'
    module Project
      class One
        include Rest
      end
    end
    
    
    # rest.rb
    module Project
      module Rest
        def display
          puts "in display"
        end
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-24
      • 2015-02-10
      • 1970-01-01
      • 2011-09-24
      • 2011-09-16
      相关资源
      最近更新 更多