Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby <;main>';:未定义的方法“[]=';_Ruby - Fatal编程技术网

Ruby <;main>';:未定义的方法“[]=';

Ruby <;main>';:未定义的方法“[]=';,ruby,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? []

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

有人能解释一下我为什么会犯这个错误吗?谢谢

块应返回累加器:

[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
返回更新的Hash。

块应返回累加器:

[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
返回更新的Hash。

inject/reduce块必须返回累加器的新值(请参见@ilya的答案)。对于某些操作而言,这是自然发生的,对于某些操作而言,情况并非如此。对于这些,我更喜欢
每个带有_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}

inject/reduce块必须返回累加器的新值(参见@ilya的答案)。对于某些操作而言,这是自然发生的,对于某些操作而言,情况并非如此。对于这些,我更喜欢
每个带有_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}

谢谢我就在你回答的时候想出来了。当它指出:)@DjamelHassaine,你不用客气:)谢谢!我就在你回答的时候想出来了。当它指出:)@DjamelHassaine时,这是很明显的:)欢迎:)OP:each|u with_object的块参数与方法名
| each,object |
的顺序相同。OP:each|u with_object的块参数与方法名
| each,object
的顺序相同。