我有一个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 添加到我的团队,而不是实际的成员。
如何单独添加成员?
答案 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])