在下面的代码中:
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模块类变量中什么都没有,当它显然有什么东西?
答案 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
以避免混乱。