Ruby<< (双倍小于)实例变量

时间:2013-03-12 21:36:11

标签: ruby

我不确定这是如何有效的代码:

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

我正在从教程中读到这篇文章但我无法找到关于如何&lt;&lt;特别适用于实例变量。我以为'&lt;&lt;'当处理数组'追加到数组'时,它刚刚被重载。这实际上是用Singleton类做的吗?

2 个答案:

答案 0 :(得分:6)

这段代码有点令人困惑。这一行:

games << game

实际上正在调用方法games,该方法返回@games。然后在该结果上调用<<方法。 Ruby解析器中有一些语法糖将<<运算符转换为左操作数上的方法调用,并且在此操作发生之前正在计算左操作数。

编辑以获得更清晰:

该行可以这样写:

(games).<< game

或者这个:

(self.games).<< game

或:

(self.games) << game

所有这些都执行games方法。

答案 1 :(得分: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