Ruby <;main>';:未定义的方法“[]=';
这使用hash.update方法工作: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? []
[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
的顺序相同。