2013-02-28 58 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])