我尝试创建一个'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'来解决问题?
答案 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)。