Ruby数组中的堆栈级别太深与哈希测试 [英] Stack level too deep in Ruby array vs hash test

查看:0
本文介绍了Ruby数组中的堆栈级别太深与哈希测试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的脚本

require 'benchmark'
require 'ostruct'

Benchmark.bmbm do |x|
  n=10000
  array = n.times.map{ |i| OpenStruct.new id: i }
  hash = Hash[*(array.map{ |s| [s.id, s] }.flatten)]

  x.report('array') do
    array.find{ |s| s.id == 100}
  end
  x.report('hash') do
    hash[100]
  end
end

为什么使用n=100000我得到:

stack level too deep (SystemStackError)

无关,但我是否以最佳方式生成哈希?

推荐答案

您正在向一个方法传递数以万计的参数,而这些参数太多,Ruby无法处理,从而导致堆栈错误。

相反,只需将未展平、未散布的映射数组传递给Hash.[],因为它接受这一点并给出相同(正确)的结果(没有SystemStackError):

Hash[array.map { |s| [s.id, s] }]

顺便说一句,我们可以看到参数计数实际上是一个简单测试的问题(而不是具体的<2-1]>):

def f(*args); end
f(*(1..1000000).to_a)  #<SystemStackError: stack level too deep>

这篇关于Ruby数组中的堆栈级别太深与哈希测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆