2

我有一Team堂课:

class Team
  attr_accessor :teamplayers
  def initialize
    @team_players = []
  end
  def <<(player)  
    @team_players << player
  end
  def to_s
    puts "THIS IS THE TEAM #{@team_players}" 
  end
end

我想将成员添加到团队中<<。我使用这段代码:

team << @goalkeepers.last
team << @defenders[-1..-4]
team << @midfielders[-1]
team << @attackers[-1..-2]

第一行工作正常,并为团队增加了一名成员。然而,其他行将数组添加到我的团队,而不是实际成员。

那么如何单独添加成员呢?

4

3 回答 3

2
team << @defenders[-1..-4]

您正在@defenders[-1..-4]另一个数组中添加一个数组 ( )。自然,实际添加的元素将是整个数组,Ruby 不会自动为您展平它。

如果您不希望它这样做,则可以连接<<方法中的元素(如果它们是数组):

def <<(player)
  if player.kind_of?(Array)
    @team_players.concat player  
  else
    @team_players << player
  end
end

您也可以在每次添加内容时展平数组:

def <<(player)
  @team_players << player
  @team_players.flatten!
end

然后,这将适用于单个对象数组。例如:

irb(main):032:0> t << ["Bob"]
=> ["Bob"]
irb(main):032:0> t << ["Alice", "Joe"]
=> ["Bob", "Alice", "Joe"]
irb(main):033:0> t << ["Bill"]
=> ["Bob", "Alice", "Joe", "Bill"]

剩下的问题是您是否覆盖<<通常工作的方式,以及这样做是否不是一个更好的主意@defenders[-1..-4].each { |d| team << d }

于 2013-02-28T12:09:50.747 回答
1

Just use + (or concat):

team = team + @defenders[-1..-4]
#or 
team.concat(@defenders[-1..-4])
于 2013-02-28T16:31:29.377 回答
0

隐式转换有点短:

def <<(*player)
   @team_players.concat player.flatten
end

坚持 slhck 的答案,没有看到扁平化的变化。

于 2013-02-28T12:28:26.657 回答