为什么可以';我的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)
)。