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]

最初の行は正常に機能し、チームに1人のメンバーを追加します。ただし、他の行は、実際のメンバーではなく、私のチームに配列を追加します。

では、どうすればメンバーを個別に追加できますか?

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

+(または)を使用するだけ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 に答える