在ruby中包含模块

时间:2009-12-26 18:05:16

标签: ruby

我是红宝石的首发,我搜索过,如果有人问过类似的问题但是找不到。所以我在这里问。

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

我创建了一个文件夹Project

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

class Project::One

  include Project::Rest

end 

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

module Project::Rest

 def display
   puts "in display"
 end

end

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

未初始化的常量Project(NameError)

请帮帮我

3 个答案:

答案 0 :(得分:3)

问题是你从未真正定义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,你必须自己定义它们。

答案 1 :(得分:1)

问题是您没有正确嵌套类/模块。您必须使用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

注意这些模块是如何嵌套的。

答案 2 :(得分:1)

如果您有多个文件中的代码,则必须先加载这些文件,然后才能访问其中的内容。这通常使用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