Это небольшое переписывание вашего основного цикла в более рубиноподобном виде.
b = Array.new
browser.tables.each_with_index do |table, t|
browser.table(:index, 1 + t).rows.each_with_index do |row, r|
a = Array.new(10)
browser.table(:index, 1 + t).row(:index, 1 + r).cells.each do |cell|
a << cell.text
end
b << a
end
end
puts b
Я переместил инициализации массива сразу выше, где они будут необходимы. Конечно, это выбор программиста.
Вместо того, чтобы создавать две переменные счетчика выше, я переключился на использование each_with_index
, которое добавляет индексную переменную, начиная с 0
. Чтобы получить 1 смещение, я добавляю 1.
Это не большие изменения, но они составляют более сплоченное приложение.
Возвращаясь к исходному коду: я вижу одну проблему, связанную с тем, что вы создаете массив a
вне циклов, а затем повторно используете его при назначении b
. Это означает, что каждый раз используется один и тот же массив, но очищается и значения сохраняются в нем. Это приведет к тому, что предыдущие значения массива будут перезаписаны, но в результате будут скопированы массивы в b
.
require 'pp'
a = []
b = []
puts a.object_id
a[0] = 1
b << a
a.clear
a[0] = 2
b << a
puts
pp b
b.each { |ary| puts ary.object_id }
# >> 2151839900
# >>
# >> [[2], [2]]
# >> 2151839900
# >> 2151839900
Обратите внимание, что массив a
многократно используется повторно.
Если я изменю a
на второй массив, то для b будет два значения, а a - два отдельных объекта:
require 'pp'
a = []
b = []
puts a.object_id
a[0] = 1
b << a
a = []
a[0] = 2
b << a
puts
pp b
b.each { |ary| puts ary.object_id }
# >> 2151839920
# >>
# >> [[1], [2]]
# >> 2151839920
# >> 2151839780
Надеюсь, это поможет вам избежать проблемы в будущем.