迭代哈希时,得到“TypeError:无法将String转换为Integer”

时间:2012-07-10 02:46:43

标签: ruby typeerror

我有一个哈希(真正的一个更大)

parsed = {"follower_count" => 500, "something_else" => "etc", "xyz" => "abc"}

和一个看起来像这样的课程

 class Company
   attr_accessor :followers

   def initialize(thehash)
      @followers = thehash['follower_count']
   end
 end

所以最后有这个代码在我担心其他任何错误之前抛出错误

>> parsed.map {|t| Company.new(t)}
TypeError: can't convert String into Integer
  from (irb):7:in `[]'
  from (irb):7:in `initialize'
  from (irb):12:in `new'
  from (irb):12
  from (irb):12:in `map'
  from (irb):12:in `each'
  from (irb):12:in `map'
  from (irb):12

2 个答案:

答案 0 :(得分:3)

当你遍历一个Hash时,该块获取一个数组作为其参数,该数组包含(按顺序)Hash中一对的键和值。所以,在这里:

parsed.map { |t| ... }

t实际上是一个双元素数组,通常写成:

parsed.map { |k, v| ... }

然后,在Company#initialize内部,当它实际上是一个双元素数组时,你将t视为哈希。

您根本不想map使用parsed,只想Company.new(parsed)

答案 1 :(得分:2)

在哈希上使用map时,您应该在块中使用两个变量:

parsed.map {|k,v| .. use k and v here .. }

您似乎根本不想迭代parsed,您希望将其用作Company.new的参数:

Company.new(parsed)