Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';我的Ruby模块方法不能访问我的模块类变量吗?_Ruby_Module - Fatal编程技术网

为什么可以';我的Ruby模块方法不能访问我的模块类变量吗?

为什么可以';我的Ruby模块方法不能访问我的模块类变量吗?,ruby,module,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

在下面的代码中:

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哈希

但是主菜单方法的第一行不能显示值

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

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


为什么模块方法认为@main\u menu\u options模块类变量中没有任何内容,而它显然包含某些内容?

第一个
@main\u menu\u options
与mixin方法中引用的
@main\u menu\u 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时,尽量避免这样的一行程序,跳过
,然后
,以避免混乱。

第一个
@main\u menu\u options
与mixin方法中引用的
@main\u 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时,尽量避免这样的一行代码,跳过
然后
以避免混乱。

我看不到
def主菜单中最后一行的要点。如果
MAIN\u MENU\u OPTIONS
为nill,那么上面的一行可能会出现命名错误。哦,没关系,我看到你刚刚从问题中复制了这个。非常感谢@tadman。谢谢你对if声明的建议。因此,需要明确的是,如果我将该变量设置为常量,我不需要添加“self”。在方法名?常量同时可用于模块级上下文和mixin级之前,它们更“通用”,所以是的。同样的原则也适用于一个类。我看不到
def main_菜单中最后一行的要点。如果
MAIN\u MENU\u OPTIONS
为nill,那么上面的一行可能会出现命名错误。哦,没关系,我看到你刚刚从问题中复制了这个。非常感谢@tadman。谢谢你对if声明的建议。因此,需要明确的是,如果我将该变量设置为常量,我不需要添加“self”。在方法名?常量同时可用于模块级上下文和mixin级之前,它们更“通用”,所以是的。同样的原则也适用于类。我假设您从包含该模块的类的实例调用了
main_menu
。对吗?是的,没错。我知道我现在需要做什么。我需要将该模块变量设置为常量,以便在模块级别以及包含该模块的任何对象都可以访问它@m=99;结束;M.instance_variable_get(“@a”)#=>99
(或
…\u get(:@a)
)。我假设您从包含该模块的类的实例调用了
主菜单。对吗?是的,没错。我知道我现在需要做什么。我需要将该模块变量设置为常量,以便在模块级别以及包含该模块的任何对象都可以访问它@m=99;结束;M.instance_variable_get(“@a”)#=>99
(或
…_get(:@a)
)。