5

これがどのように有効なコードなのかわかりません:

class Library
  def initialize(games)
    @games = games
  end

  def add_game(game)
    games << game
  end

  def games()
    @games
  end
end

games = ['WoW','SC2','D3']
lib = Library.new(games)
puts lib.games
lib.add_game('Titan')
puts lib.games

これは出力されます:

すごい SC2 D3 タイタン

私はそれが印刷されるべきだと思うだろう

すごい SC2 D3

add_game メソッドはインスタンス変数を使用しません。Ruby は初めてなので、これがどのように機能するのかわかりません。それはあるべきではありません:

def add_games(game)
  @games << game
end

私はチュートリアルからこれを読んでいますが、 << が具体的にインスタンス変数でどのように機能するかについて何も見つけることができませんでした。配列を「配列に追加」するときに「<<」がオーバーロードされただけだと思いました。これは実際にシングルトンクラスで何かをしていますか?

4

2 に答える 2

6

このコードは少しわかりにくいです。この線:

games << game

を実際に呼び出しているメソッドgamesは、 を返します@games。次に、<<その結​​果に対してメソッドが呼び出されます。Ruby パーサーには、左側のオペランドで演算子をメソッド呼び出しに変換する構文糖衣が<<あり、左側のオペランドはそれが起こる前に評価されます。

より明確にするために編集します。

この行は次のように記述できます。

(games).<< game

またはこれ:

(self.games).<< game

また:

(self.games) << game

そのすべてがgamesメソッドを実行します。

于 2013-03-12T21:41:21.957 に答える
0

クラスインスタンス変数を使用します。コードを見てください:

class Library
  def initialize(manygames)
    @games = manygames
  end

  def add_game(game)
    imlookingforclassinstancevariable << game
  end

  def imlookingforclassinstancevariable
    @games #i'm the final storage of your array
  end
end
games = ['WoW','SC2','D3']
lib = Library.new(games)
puts lib.imlookingforclassinstancevariable
lib.add_game('Titan')
puts lib.imlookingforclassinstancevariable
于 2013-03-12T22:57:42.870 に答える