0

オンラインの Ruby チュートリアルの一環として、テキスト ベースのゲームを作成する必要があります。1 つの要件は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

インスタンスアプローチを使用したい場合、またはクラス変数を使用できる場合は、ディランの答えを得ることができます。

コードの問題は、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

This would make a lot more sense as a class. This way, you can store the items in an instance variable that will persist during multiple calls to add, show, etc. You can of course put this class into a separate file and still include it.

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

問題は、このメソッドが呼び出されるたびにアイテム配列が再作成されるため、配列に渡されるメソッドの呼び出し間で永続性がないことです。Dylan Markow の回答は、インスタンス変数を使用してメソッド呼び出し間で値を保持する方法を示しています。

于 2013-06-18T20:35:40.887 に答える