为什么我的Ruby模块方法不能访问我的模块类变量?

时间:2018-02-08 19:50:03

标签: ruby module

在下面的代码中:

module UserInterface

    @main_menu_options = { 1 => "Display Task List", 2 => "Add New Task", 3 => "Edit A Task", 4 => "Delete A Task", "Q" => "Quit" }

    def main_menu(string="")
        @main_menu_options.each_value { |v| puts v }
        if @main_menu_options == nil then puts "NOTHING THERE" end
    end

end

我已经创建了一个模块变量并在其中放置了一个标准的Ruby哈希。

但是main_menu方法的第一行不能显示值。

当我注释掉该方法的第一行时,第二行总是显示" NOTHING THERE",这告诉我方法认为类变量包含nil。

我还尝试在方法体中重新创建完全相同的哈希,并且该行代码可以完美地显示其值,因此我不知道它是如何成为方法中的语句。我认为问题必须是模块类变量。

为什么那个模块方法认为我的@main_menu_options模块类变量中什么都没有,当它显然有什么东西?

1 个答案:

答案 0 :(得分:3)

第一个@main_menu_options与mixin方法中引用的@main_menu_options不同。第二种方法在任何称为include的上下文中运行。

如果您希望在同一页面上同时使用这些方法,则需要将该方法重新定义为在同一范围内:

module UserInterface
  @main_menu_options = {
    1 => "Display Task List",
    2 => "Add New Task",
    3 => "Edit A Task",
    4 => "Delete A Task",
    "Q" => "Quit"
  }

  # Module-level method has access to module-level defined variables
  def self.main_menu(string = "")
    @main_menu_options.each_value { |v| puts v }

    if @main_menu_options == nil then puts "NOTHING THERE" end
  end
end

这错过了更大的问题。由于这些选项永远不会改变,你真的应该将其定义为常量:

module UserInterface
  MAIN_MENU_OPTIONS = {
    1 => "Display Task List",
    2 => "Add New Task",
    3 => "Edit A Task",
    4 => "Delete A Task",
    "Q" => "Quit"
  }

  def main_menu(string = "")
    MAIN_MENU_OPTIONS.each_value { |v| puts v }

    if MAIN_MENU_OPTIONS == nil then puts "NOTHING THERE" end
  end
end

您需要修复if,因为这不是真正的功能代码。在编写Ruby时尽量避免使用这样的单行,请跳过then以避免混乱。