命名数组方法'to_hash'导致'堆栈级别太深'错误

时间:2013-12-22 12:46:08

标签: ruby

我尝试创建一个'to_hash'数组方法,但不断出现“堆栈级太深”的错误:

class Array
  def to_hash
    Hash[self.each_index.zip(self)]
  end
end

puts [50, 49, 53, 44].to_hash

# SystemStackError: stack level too deep

我终于知道方法名称'to_hash'导致问题。只需将其更改为“to_hsh”即可使其按预期工作:

class Array
  def to_hsh
    Hash[self.each_index.zip(self)]
  end
end

puts [50, 49, 53, 44].to_hsh

# => {0=>50, 1=>49, 2=>53, 3=>44}

如果我尝试在数组上调用'to_hash'方法(不编写我自己的方法),我得到:

  

NoMethodError:[50,49,53,44]的未定义方法'to_hash':数组

因此,如果数组没有内置的'to_hash'方法,为什么我通过命名自己的数组方法'to_hash'来解决问题?

1 个答案:

答案 0 :(得分:2)

因为Kernel#Hash方法调用to_hash。这导致递归调用。

文档说:

  

通过调用 arg.to_hash 将arg转换为哈希。当arg为nil或[]时返回空哈希。

Hash[self.each_index.zip(self)]行中,self.each_index.zip(self)生成一个数组,Kernel#Hash正在调用to_hash。现在这个to_hash成为您的自定义to_hash方法,这是一个递归调用,并将错误产生为堆栈级别太深(SystemStackError)