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

sjm*_*jmh 5 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
Run Code Online (Sandbox Code Playgroud)

这将打印出来:

魔兽SC2 D3泰坦

我认为它应该打印出来

魔兽SC2 D3

add_game方法不使用实例变量.作为Ruby的新手,我不明白它是如何工作的.不应该是:

def add_games(game)
  @games << game
end
Run Code Online (Sandbox Code Playgroud)

我正在从一个教程中读到这个,但是我无法找到关于<<如何专门使用实例变量的任何内容.当处理数组'追加到数组'时,我认为'<<'刚刚过载.这实际上是在做Singleton类吗?

Jim*_*art 6

这段代码有点令人困惑.这条线:

games << game
Run Code Online (Sandbox Code Playgroud)

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

编辑以获得更清晰:

该行可以这样写:

(games).<< game
Run Code Online (Sandbox Code Playgroud)

或这个:

(self.games).<< game
Run Code Online (Sandbox Code Playgroud)

要么:

(self.games) << game
Run Code Online (Sandbox Code Playgroud)

所有这些都执行该games方法.