我有像这样的数组和哈希的特殊构造
[
{ 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
所以什么错了?这是实现这一目标的最佳方式
Ruby说:
“未定义的方法”&lt;&lt;&lt;为零:NilClass“
答案 0 :(得分:2)
将<<
替换为=
从@v[:filled_out] << @q
到@v[:filled_out] = @q
<<
用于将项目插入数组
答案 1 :(得分: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
以保存其他内容,以免您使用未加工的变量,但我只是将它们放在一起以向您展示一个有效的示例。
有时,当您构建这样的数据时,使用对最终结果更为冗长的代码会很好。