LINUX.ORG.RU

[ruby] .each и многомерные массивы

 


0

1

Ковыряясь с руби нашел некоторую странность при переборе элементов многомерного массива. Следующий код:

array = Array.new
array[0] = ["123","456","789"]
array[1] = ["abc","dfg","hjk"]
array.each do |key, val|
  p "{#{key}} =>"
  val.each do |val2|
    p val2
  end
end
выдаёт не то, что нужно:
ruby array_test.rb
"{123} =>"
"456"
"{abc} =>"
"dfg"

Для сравнения вариант для php:

$array[0] = array ("123", "456", "789");
$array[1] = array ("abc", "dfg", "hjk");
foreach ($array as $key => $val) {
  echo "{".$key."} => \n";
  foreach ($val as $val2) {
    echo $val2."\n";
  }
}
выдаёт ожидаемый результат:
php array_test.php
{0} => 
123
456
789
{1} => 
abc
dfg
hjk

Вопрос: Где я ошибся? Почему руби выдает такой странный результат?

UPD: попробовал вариант с циклом for, всё идеально (но некрасиво):

array = Array.new
array[0] = ["123","456","789"]
array[1] = ["abc","dfg","hjk"]
for i in 0..array.size-1
   p "{#{i}} => "
   for j in 0..array[i].size-1
     p array[i][j]
   end
end
В результате, как и положено:
ruby array_test.rb
"{0} => "
"123"
"456"
"789"
"{1} => "
"abc"
"dfg"
"hjk"

Deleted

Последнее исправление: Deleted (всего исправлений: 1)

Где я ошибся? Почему руби выдает такой странный результат?

В первом примере, пытаешься работать с массивом как с хэшем

sdio ★★★★★
()
Ответ на: комментарий от Deleted

> То есть, в руби для массива не применима связь {ключ}=>[значение]?
Отвечу сам: не применима
sdio, спасибо за разъяснение

Deleted
()
Ответ на: комментарий от Deleted

Это хэш

замени первую строку

array = Hash.new

и далее твой пример

sdio ★★★★★
()
array = Array.new
array[0] = ["123","456","789"]
array[1] = ["abc","dfg","hjk"]
array.each_index do |inx|
  p "{#{inx}} =>"
  array[inx].each do |val|
    p val
  end
end

примерно так.

arsi ★★★★★
()

>Array.new

Можно писать просто []

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.