作为在线Ruby教程的一部分,我必须创建一个基于文本的游戏。一个要求是我使用require
来引入另一个文件。我和include
持有方法的模块一样。但是,我不能产生我想要的结果。这是我的模块文件:
module Inventory
def Inventory.inventory(item)
items = Array.new
if item == "show"
items.inspect
else
items << item
end
end
end
我希望将参数(item)
作为字符串添加到数组items
,当我将inspected
参数传递给它时,该字符串可以是"show"
。
例如,我想在库存中添加'bat',因此我调用了Inventory.inventory("bat")
。后来我想添加其他东西。但是,当我打电话给Inventory.inventory("show")
时,它没有显示任何内容。
我花了几天时间在这里查看了许多其他教程和数百个问题,但仍然无法使其工作。我可能不理解一些非常基本的东西,所以请在我还在学习的时候对我好一点。
这是我添加到阵列的方式吗?我试图让它展示的方式?或者我不明白如何使用方法和参数?
答案 0 :(得分:2)
您的代码存在的问题是,每次拨打items
时都会初始化inventory
本地变量。
这是一个将项目保存在类变量中的版本:
module Inventory
def Inventory.inventory(item)
@@items ||= Array.new
if item == "show"
@@items.inspect
else
@@items << item
end
end
end
Inventory.inventory 1
Inventory.inventory 2
p Inventory.inventory 'show'
这正在制作
"[1, 2]"
答案 1 :(得分:1)
作为一个班级,这会更有意义。这样,您可以将项目存储在实例变量中,该变量将在多次调用add
,show
等期间保持不变。您当然可以将此类放入单独的文件中并仍然包含它。 / p>
class Inventory
def initialize
@items = []
end
def add(item)
@items << item
end
def show
@items.inspect
end
end
# To use the class:
inventory = Inventory.new
inventory.add('bat')
inventory.show
# => ["bat"]
答案 2 :(得分:0)
问题是每次调用此方法时都会重新创建items数组,因此对于传递给数组的内容,方法调用之间不存在持久性。 Dylan Markow的答案显示了如何使用实例变量在方法调用之间保持值。