.each, не повторяя правильные элементы массива

У меня есть два класса ruby для хранения некоторых пользовательских журналов в игре. RoundLog содержит информацию, относящуюся к одному раунду, а BattleLog - это просто массив, содержащий несколько элементов RoundLog.

class RoundLog
 attr_writer :actions, :number

 def initialize(number)
 @number = number
 @actions = []
 end
 def to_a
 [@number, @actions]
 end
 ...
end

class BattleLog
 attr_accessor :rounds
 def initialize
 @rounds = []
 end
 def print
 @rounds.each do |round|
 round.to_a
 end
 end
 ...
end

Если у меня есть следующий экземпляр BattleLog:

report = [#<roundlog:0x00000008ab8328 1="" @number="1," @actions="[" rat"="" hits="" test="" and="" deals="" points="" of="" damage",="" "test="" rat="" damage"]="">,
#<roundlog:0x00000008acc170 1="" @number="2," @actions="[" rat"="" hits="" test="" and="" deals="" points="" of="" damage",="" "test="" rat="" damage"]="">,
#<roundlog:0x00000008aef5f8 1="" @number="3," @actions="[" rat"="" hits="" test="" and="" deals="" points="" of="" damage",="" "test="" rat="" damage"]="">,
#<roundlog:0x00000008b02978 1="" @number="4," @actions="[" rat"="" hits="" test="" and="" deals="" points="" of="" damage",="" "test="" rat="" damage"]="">,
#<roundlog:0x00000008b1a280 1="" @number="5," @actions="[" rat"="" hits="" test="" and="" deals="" points="" of="" damage"]="">]
</roundlog:0x00000008b1a280></roundlog:0x00000008b02978></roundlog:0x00000008aef5f8></roundlog:0x00000008acc170></roundlog:0x00000008ab8328>

Тогда следующий фрагмент кода не работает: report.each {|x| x.to_a} report.each {|x| x.to_a} Вместо того, чтобы возвращать правильно отформатированную информацию:

[1, ["Rat hits Test and deals 1 points of damage", "Test hits Rat and deals 1 points of damage"],
[2, ["Rat hits Test and deals 1 points of damage", "Test hits Rat and deals 1 points of damage"], ...]

Он возвращает весь объект RoundLog:

[#<roundlog:0x00000008ab8328 1="" @number="1," @actions="[" rat"="" hits="" test="" and="" deals="" points="" of="" damage",="" "test="" rat="" damage"]="">,
#<roundlog:0x00000008acc170 1="" @number="2," @actions="[" rat"="" hits="" test="" and="" deals="" points="" of="" damage",="" "test="" rat="" damage"]="">,...]
</roundlog:0x00000008acc170></roundlog:0x00000008ab8328>

Однако, если я попробую что-то вроде этого: report.first.to_a он правильно возвращает [1, ["Rat hits Test and deals 1 points of damage", "Test hits Rat and deals 1 points of damage"] Любая идея, что не так с моим кодом? Я попытался переименовать to_a в нечто другое, поэтому я не думаю, что проблема связана с именем функции. Это мой первый вопрос о SO, поэтому, пожалуйста, будьте снисходительны.

1 ответ

Использование map вместо each должно решить вашу проблему.

each выполняет некоторые операции внутри блока, а затем возвращает объект/массив/хэш/перечислим/все, что each был призван. однако map возвращает новый массив с возвращаемыми значениями, вычисленными в вашем блоке.

licensed under cc by-sa 3.0 with attribution.