Динамическое создание многомерного массива в Ruby

Я пытаюсь динамически построить многомерный массив. Я хочу в основном это (выписано для простоты):

b = 0

test = [[]]

test[b] << ["a", "b", "c"]
b += 1
test[b] << ["d", "e", "f"]
b += 1
test[b] << ["g", "h", "i"]

Это дает мне ошибку: NoMethodError: неопределенный метод `‹‹' для nil:NilClass. Я могу заставить его работать, настроив массив, например

test = [[], [], []]

и это работает нормально, но в моем реальном использовании я не буду знать, сколько массивов потребуется заранее. Есть лучший способ сделать это? Спасибо


person MWean    schedule 08.05.2010    source источник


Ответы (3)


Нет необходимости в индексной переменной, которую вы используете. Просто добавьте каждый массив в свой массив test:

irb> test = []
  => []
irb> test << ["a", "b", "c"]
  => [["a", "b", "c"]]
irb> test << ["d", "e", "f"]
  => [["a", "b", "c"], ["d", "e", "f"]]
irb> test << ["g", "h", "i"]
  => [["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"]]
irb> test
  => [["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"]]
person Paige Ruten    schedule 08.05.2010

Не используйте метод <<, вместо этого используйте =:

test[b] = ["a", "b", "c"]
b += 1
test[b] = ["d", "e", "f"]
b += 1
test[b] = ["g", "h", "i"]

Или еще лучше:

test << ["a", "b", "c"]
test << ["d", "e", "f"]
test << ["g", "h", "i"]
person Jakub Hampl    schedule 08.05.2010

Вот простой пример, если вы знаете размер создаваемого массива.
@OneDArray=[1,2,3,4,5,6,7,8,9] [email protected] c_loop=p_size /3 помещает "c_loop is #{c_loop}" left=p_size-c_loop*3

@TwoDArray=[[],[],[]]
k=0
for j in 0..c_loop-1
       puts "k is  #{k} "
        for i in 0..2
         @TwoDArray[j][i]=@OneDArray[k]
      k+=1
    end
 end

результатом будет @TwoDArray= [[1,2,3].[3,4,5],[6,7,8]]

person vidur punj    schedule 22.03.2013