Ruby在数组中使用哈希构建哈希值

时间:2016-01-30 02:29:26

标签: ruby-on-rails arrays ruby hash

我有像这样的数组和哈希的特殊构造

[
  { 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“

2 个答案:

答案 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以保存其他内容,以免您使用未加工的变量,但我只是将它们放在一起以向您展示一个有效的示例。

有时,当您构建这样的数据时,使用对最终结果更为冗长的代码会很好。