2013-02-28 33 views
0

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

第一行正常工作,并向团队中添加一个成员。然而,其他线路将阵列添加到我的团队,而不是实际的成员。

如何分别添加成员?

+2

问题是什么?你是否得到一个错误,因为你的代码似乎会做你的标题所暗示的。 – 2013-02-28 11:39:40

回答

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 }

0

与隐式转换短了一下:

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

陪着slhck答案,也没有见到扁平化的变化。

0

只需使用+(或concat):

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