【问题标题】:Can't spot the stack level too deep error无法发现堆栈级别太深的错误
【发布时间】:2018-04-26 09:52:45
【问题描述】:

我正在尝试做一个扁平化的变体,例如:

{a: {b:  1}}

我应该得到这个

#=> {"a.b":1}

等等

这是我的代码:

require 'active_support'
require 'active_support/core_ext'
def pathifize(hash,results = {}, current_key='', b = ".")
  hash.each do |new_key, value|
    combined_key = [current_key,new_key].delete_if { |k| k.blank? }.join(b)
    if value.is_a?(Hash)
      pathifize(hash,results, combined_key, b)
    else
      results[combined_key] = value
    end
  end
end

在 Irb 上进行测试时,我的堆栈级别太深了。

【问题讨论】:

  • 这很正常,您的递归外检查是value.is_a?(Hash),但pathifize 是在hash 上调用的
  • 旁注: github.com/am-kantox/iteraptor 是(除了许多其他事情之外)您想要的宝石。你可以看看它的灵感代码。
  • @mdesantis 谢谢,嗯,我还是得到了 => {:a=>{:b=>1}} 你知道如何让它像 => {"a.b" :1}
  • @Arb 是的,我知道,我试过了,但这是另一个问题,恕我直言,你应该先尝试自己修复它:) 这是一个很好的练习

标签: ruby-on-rails ruby yaml


【解决方案1】:

您的经常性pathifize 调用将原始hash(这就是嵌套哈希创建无限递归的原因)作为参数,而它可能应该使用value

pathifize(value, results, combined_key, b)

【讨论】:

  • 谢谢,嗯,我还是得到了 => {:a=>{:b=>1}} 你知道如何让它像 => {"a.b":1 }
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 2013-10-05
相关资源
最近更新 更多