Цикл и создание массива в Ruby - PullRequest
0 голосов
/ 16 января 2011

Попытка перенести некоторый старый код PHP на Ruby и отсутствие ключевой информации о создании массивов в Ruby.

Код PHP:

foreach ($results as $r) {
    $array[$r['column']][] = $r
}

Это самый простой способ сделать этов рубине?Нужно ли инициализировать второй массив?

@array = []
result.each do |r|
  @array[r.cron_column] = []
  @array[r.cron_column] << r
end

Я полагаю, что это простая проблема синтаксиса, но мой поиск в Google оказался пустым.Спасибо за вашу помощь!

Ответы [ 3 ]

1 голос
/ 16 января 2011

Вы индексируете в пустой массив, так что всегда будет возвращаться ноль. nil не определяет оператор <<, поэтому вы получаете ошибку. Вам нужно инициализировать значение в массиве [index], если вы хотите использовать оператор <<. </p>

Я предполагаю, что вам нужен массив массивов, так что вы можете использовать его вместо этого, чтобы инициализировать значение в items [index] пустым массивом, если оно равно нулю, прежде чем помещать в него значение

items = []
array.each do |r|
  (items[r.column] ||= []) << r
end

Единственное изменение здесь в том, что если items [r.column] возвращает nil, он будет установлен равным пустому массиву, иначе ничего не будет сделано. Если вы действительно хотите установить значение для items [index] в r, просто используйте оператор =.

0 голосов
/ 16 января 2011

Вы уверены, что вам нужен массив в качестве вывода?казалось бы, хэш будет более удобным;более того, ваш сценарий проще встроить (обычно это знак того, что вы находитесь на правильном пути):

# example
results = [
  OpenStruct.new(:x => 1, :cron_column => 0), 
  OpenStruct.new(:x => 2, :cron_column => 1), 
  OpenStruct.new(:x => 3, :cron_column => 1),
] 

@array = results.group_by(&:cron_column)
# {0=>[#<OpenStruct x=1, cron_column=0>], 
#  1=>[#<OpenStruct x=2, cron_column=1>, #<OpenStruct x=3, cron_column=1>]}

Если у cron_column «нет дыр» (вот и все, у вас есть значения от 0 доN), вы можете легко создать массив с этой же идеей: results.group_by(&:cron_column).sort.map { |k, v| v } или results.group_by(&:cron_column).sort.map(&:last), как вы предпочитаете.

0 голосов
/ 16 января 2011
array = results.inject([]) { |m, r| m[r.column] = r; m }

Обновление : о, e1[] = e2 добавляет новый элемент массива в PHP, поэтому tokland является правильным, в этом случае:

array = results.inject([]) { |m, r| (m[r.column] ||= []) << r; m }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...