无法理解为什么此代码无法将简单数组转换为简单哈希值

时间:2019-08-07 20:31:48

标签: ruby

下面附有代码。

 arrayy = [[1,'one'],[2,'two'],[3,'three']]
 hashy = {}
 i = 0
 arrayy.each do
   hashy[arrayy[i,0]] = arrayy [i,1]
   i = i+1
 end
 puts hashy[1]
 puts hashy[2]
 puts hashy[3]
end

此代码不输出任何内容。没有错误。因此,我猜测问题是哈希表中没有添加任何内容。

2 个答案:

答案 0 :(得分:6)

不确定您要在这里实现什么,但是当您在循环中执行arrayy [i,0]时,您表示要获取零个元素。

当您传入两个数字作为数组的参数时,第一个数字是目标值的索引,第二个数字是长度。例如:

arr = ['a', 'b', 'c', 'd', 'e']
puts arr[2, 3] 

这将显示['c','d','e'],它是“从索引2的元素开始,获取3个元素”。

答案 1 :(得分:4)

您要请求零个元素,这是一个空数组,因此您要对空数组上的所有内容进行键控,并且所有元素都会发生碰撞。要解决此问题,只需使用迭代器,因为each为您提供了所需的元素:

arrayy = [[1,'one'],[2,'two'],[3,'three']]

hashy = {}
arrayy.each do |key, value|
  hashy[key] = value
end

p hashy
# => {1=>"one", 2=>"two", 3=>"three"}

在您的代码中,您得到的实际结果是:

p hashy
# => {[]=>[[3, "three"]]}

在这里您可以看到正在使用的[]键。 p方法对于查看事物的内部结构非常方便。 p hashy等同于puts hashy.inspect

正如Sergio指出的那样,您可能以错误的方式引用了数组。要深入浏览两个级别,请执行以下操作:

hashy[arrayy[i][0]] = arrayy [i][1]

[i,0]的意思是“在数组 i 的索引处选择下一个 0 元素”,而[i][0]的意思是“在索引处的数组处 i 选择索引为 0 “的值。

值得注意的是,最简单的解决方案是使用已经执行此操作的Array#to_h

arrayy = [[1,'one'],[2,'two'],[3,'three']]

hashy = array.to_h

p hashy
# => {1=>"one", 2=>"two", 3=>"three"}