Arrays 获得;未定义的方法“[]=';对于nil:NilClass“;使用哈希注入数组时出错

Arrays 获得;未定义的方法“[]=';对于nil:NilClass“;使用哈希注入数组时出错,arrays,ruby,hashtable,inject,Arrays,Ruby,Hashtable,Inject,这是我第一次使用Ruby,我需要使用inject方法从给定数组创建哈希。这段代码非常接近地反映了我找到的几个教程,但是在执行时,对于nil:NilClass会出现一个未定义的方法“[]=”错误。我有什么遗漏吗 def int_hash() [[:key1, "value1"], [:key2, "value2"]].inject({}) do |hash, element| hash[element.first] = ele

这是我第一次使用Ruby,我需要使用inject方法从给定数组创建哈希。这段代码非常接近地反映了我找到的几个教程,但是在执行时,对于nil:NilClass会出现一个
未定义的方法“[]=”错误。我有什么遗漏吗

def int_hash()
    [[:key1, "value1"], [:key2, "value2"]].inject({}) do |hash, element|
            hash[element.first] = element.last
            puts hash
    end
end

int_hash()

由于
put
是块中的最后一条语句,它返回
nil
,因此返回
nil
,导致累加器
hash
在第二次迭代中变为
nil
。你应该返回散列。您应该将数组作为参数传递给
inj_hash
方法,以使其可重用

def inj_hash(arr)
  arr.inject({}) do |hash, element|
    hash[element.first] = element.last
    hash
  end
end

inj_hash([[:key1, "value1"], [:key2, "value2"]])
#=> {:key1=>"value1", :key2=>"value2"}
从键值对数组创建哈希的最简单解决方案是使用


虽然最好使用,或者,你可以考虑编写你所拥有的“代码>……做散列,(k,v)hash [k]=v.…/代码>,这是一个强大而有用的语言特性。或者切换到<代码>哈希*合并!
[:key1,“value1”],[:key2,“value2”]])注入({}){散列,元素{散列.合并!(element.first=>element.last)}
)甚至是
数组#到{h
[:key1,“value1”],[:key2,“value2”]]到{/code>)。但是这看起来像是一个
可枚举的#inject
练习,所以你的第一个
合并版本可能是最合适的。如果您想要调试输出,可以使用
p hash
。与
put相反,它返回传递的参数。
arr = [[:key1, "value1"], [:key2, "value2"]]
Hash[arr]
#=> {:key1=>"value1", :key2=>"value2"}