Как я могу напечатать контент из массива внутри each_with_index на основе индекса? - PullRequest
0 голосов
/ 16 января 2019

У меня есть два массива:

a = [1, 2, 3]
b = [{:item => 'apple', :quantity => 92}, {:item => 'banana', :quantity => 43}, {:item => 'kiwi', :quantity => 55}]

И я хочу вывод примерно так:

1. apple 92 2. banana 43 3. kiwi 55

Теперь, поскольку важно, чтобы каждый элемент в массиве b был выровнен по порядку значений в массиве a, я решил написать цикл each_with_index, чтобы иметь возможность извлекать данные в желаемая позиция из массива b:

a.each_with_index do |a_value, i| 
  puts a_value 
  puts '.' 
  puts b[i][:item] 
  puts b[i][:quantity]
end

Но я получаю эту ошибку:

NoMethodError: undefined method `[]' for nil:NilClass
    from (irb):8:in `block in irb_binding'
    from (irb):8:in `each'
    from (irb):8:in `each_with_index'
    from (irb):8
    from C:/RailsInstaller/Ruby2.3.3/bin/irb.cmd:19:in `<main>'

Что я нахожу довольно странным, потому что хеш в этой позиции не пустой.

Если я распечатываю все содержимое массива в этой позиции, он работает, например:

a.each_with_index do |a_value, i| 
  puts b[i]
end

Что дает:

{:item => 'apple', :quantity => 92} 
{:item => 'banana', :quantity => 43} 
{:item => 'kiwi', :quantity => 55}

но я не могу указать ключ внутри хеша для печати содержимого? Что с этим?

Ответы [ 3 ]

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

Попробуйте следующее:

a = [1, 2, 3]
b = [{:item => 'apple', :quantity => 92}, {:item => 'banana', :quantity => 43}, {:item => 'kiwi', :quantity => 55}]

a.each_with_index do |a_value, i| 
  puts "#{a_value}. #{b[i][:item]} #{b[i][:quantity]}"
end

это выдаст:

1. apple 92
2. banana 43
3. kiwi 55

ИЛИ если вы хотите иметь вывод типа

1. apple 92 2. banana 43 3. kiwi 55

тогда вы можете использовать карту с индексом

output = a.map.with_index do |a_value, i| 
  "#{a_value}. #{b[i][:item]} #{b[i][:quantity]}"
end.join(' ')
puts output
0 голосов
/ 16 января 2019

но я не могу указать ключ внутри хеша для печати содержимого? Что с этим?

Это не имеет смысла, конечно. Если у вас есть хеш, вы можете получить его ключи / значения. Проблема в том, что у вас нет хеша. Вместо этого один из ваших b[i] равен нулю (что вызывает ошибку).

Проверьте это, напечатав их с p b[i] вместо puts b[i].

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

Вам не нужно a массив

b.map(&:values).map.with_index {|(item, quantity), index| 
 "#{index + 1}. #{item} #{quantity}"
}.join(' ')
=> "1. apple 92 2. banana 43 3. kiwi 55"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...