为什么我的一个衬垫块不起作用?

时间:2015-02-25 18:54:53

标签: ruby hash block

我在codequizzes.com上看到了这个:

  

转换此

people = [["bob", 320], ["edgar", 152], ["maria", 125]]
     

{"bob" => 320, "edgar" => 152, "maria" => 125}
     

答案:

Hash[people]
     

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

我的单行班车出了什么问题?

1 个答案:

答案 0 :(得分:5)

您忘了返回memo

people.inject({}) {|memo, (name, number)| memo[name] = number; memo }
分配后,

Hash#[]=会返回。在您的中,您使用方法#[]=值将添加到正在返回em>并将其分配给memo。您的memoFixnum个实例,并且在 next 迭代中,#[]=已被调用,如320#[]=。但是Fixnum#[]=不存在,所以你得到了预期的错误。

但是使用#each_with_object,您无需返回memo

people.each_with_object({}) {|(name, number), memo| memo[name] = number }

以上将有效。