如何将数组中的多个对象铲入对象?

时间:2013-02-28 11:35:57

标签: ruby refactoring

我有一个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]

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

如何单独添加成员?

3 个答案:

答案 0 :(得分:1)

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 }是不是更好的主意。

答案 1 :(得分:0)

隐式转换有点短:

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

保持冷静的答案,没有看到扁平的变化。

答案 2 :(得分:0)

只需使用+(或concat):

team = team + @defenders[-1..-4]
#or 
team.concat(@defenders[-1..-4])