这可以使用hash.update方法:
[4, 8, 15, 16, 23, 42].inject({}) { |a, i| a.update(i => i) }
但是此代码段使用a[i] = i
:
[4, 8, 15, 16, 23, 42].inject({}) { |a, i| a[i] = i }
导致以下错误:
<code>NoMethodError: undefined method \`[]=' for 4:Integer
Did you mean? []
from (irb):1:in \`block in irb_binding'>
from (irb):1:in \`each'
from (irb):1:in \`inject'
from (irb):1
</code>
有人请向我解释为什么我会收到此错误?谢谢。
答案 0 :(得分:2)
阻止应该返回累加器:
[4, 8, 15, 16, 23, 42].inject({}) { |a, i| a[i] = i; a }
#=> {4=>4, 8=>8, 15=>15, 16=>16, 23=>23, 42=>42}
这就是inject
的工作原理。第一个实例有效,因为Hash#update
返回更新的哈希值。
答案 1 :(得分:1)
注入/减少块必须返回累加器的新值(参见@ ilya的答案)。对于某些操作,这种情况自然发生,对某些人而言 - 不是很多。对于那些人,我更喜欢处理累加器跟踪的each_with_object
。
[4, 8, 15, 16, 23, 42].each_with_object({}) { |i, memo| memo[i] = i }
(请注意,块参数在此处是另一种顺序)
不知道你是否真的想要实现这种转变,或者它只是一个示例代码,但如果你这样做,这是另一种方法:
ary = [4, 8, 15, 16, 23, 42]
ary.zip(ary).to_h
# => {4=>4, 8=>8, 15=>15, 16=>16, 23=>23, 42=>42}