<main>'中的ruby哈希块:undefined method` [] ='

时间:2017-06-07 17:35:34

标签: ruby

这可以使用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>

有人请向我解释为什么我会收到此错误?谢谢。

2 个答案:

答案 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}