在ruby中向哈希添加项目,为什么项被覆盖?

时间:2017-09-22 02:15:37

标签: ruby

我有以下代码:

chartJsObject = [{label: "Label Stuff", datasets: []}]

i = 0

while i < 5 do
  chartJsObject[i][:datasets] << [rand(10), rand(10)] if chartJsObject[i]
  i+=1
end

虽然我希望datasets包含五组#,例如[9, 9][1, 2]等,但我得到:

chartJsObject # => [{"label":"Label Stuff","datasets":[[9,9]]}]

我在while循环中做错了什么?

2 个答案:

答案 0 :(得分:1)

chart_js_object只有一个元素,索引为0.因此每次调用chart_js_object[i] i都不是零,而是返回nil。这会导致错误,除非您的操作规定结束时的条件导致代码忽略第一次之后的每次迭代。

让我们使用Ruby standards进行变量命名。我会翻译成snake_case。此外,在Ruby中,while循环非常罕见。要执行特定次数的操作,您只需使用#times方法。

所以我们最终得到了这个:

>> 5.times { chart_js_object[0][:datasets] << [rand(10), rand(10)] }
>> chart_js_object
=> [{:label=>"Label Stuff", :datasets=>[[0, 4], [6, 0], [5, 4], [4, 6], [8, 6]]}]

答案 1 :(得分:1)

chartJsObject数组只有一个数据,因此数组计数为1,数组索引为chartJsObject[0]。循环体仅运行一次,因为chartJsObject数组中只有一个数据,并且您已将条件指定为

if chartJsObject[i]

这就是它给你结果的原因。