为什么我的 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 }

上面的方法可行。