使用shove将字符串添加到ruby中的数组中

时间:2013-06-18 20:04:10

标签: ruby arrays module include require

作为在线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")时,它没有显示任何内容。

我花了几天时间在这里查看了许多其他教程和数百个问题,但仍然无法使其工作。我可能不理解一些非常基本的东西,所以请在我还在学习的时候对我好一点。

这是我添加到阵列的方式吗?我试图让它展示的方式?或者我不明白如何使用方法和参数?

3 个答案:

答案 0 :(得分:2)

如果您想使用实例方法或者您可以使用类变量,那么您可以回答Dylan。

您的代码存在的问题是,每次拨打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)

作为一个班级,这会更有意义。这样,您可以将项目存储在实例变量中,该变量将在多次调用addshow等期间保持不变。您当然可以将此类放入单独的文件中并仍然包含它。 / 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的答案显示了如何使用实例变量在方法调用之间保持值。