2016-01-30 2 views
-2

У меня есть специальная конструкция массива и хэш, как этотРубин построить хэш в хэш в массиве

[ 
    { Qid: '3', QName: 'Test1', filled_out: [ 
     { Id: '234', Date: '25.04.2015 23:14:15', Score: rand(10..100)}, 
     { Id: '4587', Date: '27.04.2015 11:13:15', Score: rand(10..100)}, 
     { Id: '33254', Date: '23.05.2015 09:19:17', Score: rand(10..100)} 
    ] 
    }, 
    { 
    Qid: '3', QName: 'Test2', filled_out: [ 
     { Id: '2478', Date: '25.04.2015 23:14:15', Score: rand(10..100) }, 
     { Id: '12357', Date: '27.04.2015 11:13:15', Score: rand(10..100) }, 
     { Id: '9654', Date: '23.05.2015 09:19:17', Score: rand(10..100) } 
    ] 
    }, 
    { 
    Qid: '3', QName: 'Test3', filled_out: [ 
     { Id: '47854', Date: '25.04.2015 23:14:15', Score: rand(10..100) }, 
     { Id: '12365', Date: '27.04.2015 11:13:15', Score: rand(10..100) }, 
     { Id: '77788547', Date: '23.05.2015 09:19:17', Score: rand(10..100) } 
    ] 
    }, 
    { 
    Qid: '3', QName: 'Test4', filled_out: [ 
     { Id: '1214', Date: '25.04.2015 23:14:15', Score: rand(10..100) }, 
     { Id: '5698', Date: '27.04.2015 11:13:15', Score: rand(10..100)}, 
     { Id: '1906', Date: '23.05.2015 09:19:17', Score: rand(10..100) } 
    ] 
    } 
] 

Эта конструкция является статическим кодом. Теперь я хочу попытаться создать эту конструкцию с помощью рандомизатора.

Я попробовал этот код, но он не работает

@arr = Array.new 

rand(1..12).times do |i| 
    @v = Hash.new 
    @v[:Qid] = rand(10..1000) 
    @v[:QName] = 'Test' 
    @v[:filled_out] = nil 

    rand(1..8).times do |k| 
     @q = Hash.new 
     @q[:Id] = rand(10..1000) 
     @q[:Date] = '25.04.2015 23:14:15' 
     @q[:Score] = rand(1..100) 

     @v[:filled_out] << @q 
    end 
    @arr << @v 
end 

Так что случилось? Wht это лучший способ понять, что

Рубин говорит:

"undefined method `<<' for nil:NilClass"

+3

Я вижу два '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. –

+1

Я думаю, что есть опечатка в 'rand (1.8)' too –

+4

Я не вижу метода 'each'. – orde

ответ

2

Заменить << с =

От @v[:filled_out] << @q до @v[:filled_out] = @q

<< используется для вставки элемента в массиве

+0

Теперь Ruby говорит: нет неявного преобразования Symbol в Integer – Denis

+0

Но похоже, что Hash переопределит каждый цикл, а не append, не так ли? – Denis

+0

На каких строках это дает ошибку? Смотрите здесь, я работаю без ошибок: http://is.gd/kwfJCN – Sharj

2

Мое предложение состояло в том, чтобы собрать массивы перед рукой и и перебирать их.

Вот пример, который я поставил вместе:

arr = Array.new(rand(1..12)) 

arr.each_with_index do |v, i| 
    filled_out = Array.new(rand(1..8)) 

    filled_out.each_with_index do |j, k| 
    filled_out[k] = { 
     'Id': rand(10..1000), 
     'Date': '25.04.2015 23:14:15', 
     'Score': rand(1..100) 
    } 
    end 

    arr[i] = { 
    'Qid': rand(10..1000), 
    'QName': "test", 
    'filled_out': filled_out 
    } 

end 

puts arr 

Вы могли бы бросить each_with_index с чем-то еще, чтобы спасти вас от использования uneeded переменных, но я просто бросил это вместе, чтобы показать вам рабочий пример.

Иногда, когда вы строите такие данные, полезно использовать более подробный код в отношении конечного результата.

Смежные вопросы