0

作为在线 Ruby 教程的一部分,我必须创建一个基于文本的游戏。一个要求是我require用来拉入另一个文件。我已经做到了这一点以及include包含方法的模块。但是,我无法产生我想要的结果。这是我的模块文件:

module Inventory

  def Inventory.inventory(item)

    items = Array.new

    if item == "show"
      items.inspect
    else
      items << item
    end
  end

end

我希望将参数作为字符串(item)添加到数组中,当我将参数传递给它时可以使用该字符串。itemsinspected"show"

例如,我想在库存中添加一个“蝙蝠”,所以我调用Inventory.inventory("bat"). 稍后我想添加其他内容。但是当我打电话时Inventory.inventory("show"),它什么也没显示。

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

这是我添加到数组的方式吗?我试图让它显示的方式?还是我不明白如何使用方法和参数?

4

3 回答 3

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]"
于 2013-06-18T20:56:35.017 回答
1

作为一个班级,这将更有意义。这样,您可以将项目存储在实例变量中,该变量将在多次调用 、 等期间持续存在addshow您当然可以将此类放入单独的文件中并仍然包含它。

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"]
于 2013-06-18T20:16:09.773 回答
0

问题是每次调用此方法时都会重新创建您的 items 数组,因此对于传递到数组中的内容,方法调用之间没有持久性。Dylan Markow 的回答展示了如何使用实例变量在方法调用之间保持值。

于 2013-06-18T20:35:40.887 回答