为什么我的 one liner block 不起作用?
Why didn't my one liner block work?
我在 codequizzes.com 上看到了这个:
Convert this
people = [["bob", 320], ["edgar", 152], ["maria", 125]]
to
{"bob" => 320, "edgar" => 152, "maria" => 125}
Answer:
Hash[people]
or
people.inject({}) do |memo, (name, number)|
memo[name] = number
memo
end
以上都奏效了。但是,我下面的单行答案没有:
people.inject({}) {|memo, (name, number)| memo[name] = number }
我收到这个错误:
NoMethodError: undefined method `[]=' for 320:Fixnum
我的单线怎么了?
你忘了 return memo
:
people.inject({}) {|memo, (name, number)| memo[name] = number; memo }
Hash#[]=
returns 赋值后的 value。在您的 块 中,您正在使用 #[]=
方法将 value 添加到 key ,并且 值 正在 return 编辑并分配给 memo
。您的 memo
是一个 Fixnum
实例,并且在 下一个 迭代中,#[]=
已被调用,例如 320#[]=
。但是 Fixnum#[]=
不存在,所以你得到了预期的错误。
但是使用 #each_with_object
,你不需要 return memo
:
people.each_with_object({}) {|(name, number), memo| memo[name] = number }
上面的方法可行。
我在 codequizzes.com 上看到了这个:
Convert this
people = [["bob", 320], ["edgar", 152], ["maria", 125]]
to
{"bob" => 320, "edgar" => 152, "maria" => 125}
Answer:
Hash[people]
or
people.inject({}) do |memo, (name, number)| memo[name] = number memo end
以上都奏效了。但是,我下面的单行答案没有:
people.inject({}) {|memo, (name, number)| memo[name] = number }
我收到这个错误:
NoMethodError: undefined method `[]=' for 320:Fixnum
我的单线怎么了?
你忘了 return memo
:
people.inject({}) {|memo, (name, number)| memo[name] = number; memo }
Hash#[]=
returns 赋值后的 value。在您的 块 中,您正在使用 #[]=
方法将 value 添加到 key ,并且 值 正在 return 编辑并分配给 memo
。您的 memo
是一个 Fixnum
实例,并且在 下一个 迭代中,#[]=
已被调用,例如 320#[]=
。但是 Fixnum#[]=
不存在,所以你得到了预期的错误。
但是使用 #each_with_object
,你不需要 return memo
:
people.each_with_object({}) {|(name, number), memo| memo[name] = number }
上面的方法可行。