ruby-on-rails - 堆栈级别太深,即使递归调用在函数末尾?

标签 ruby-on-rails ruby recursion pagination tail-recursion

我正在遵循答案 here 的建议,并确认 :tailcall_optimization=>true 和 :trace_instruction=>false,但我仍然得到:

SystemStackError: stack level too deep

...

... 8696 levels...

我做错了什么?

  def persist_shipments_then_next(prev_data)
    persist_shipments(prev_data)

    next_token = prev_data['NextToken']
    puts next_token
    unless next_token.nil?
      next_data = @client.list_inbound_shipments_by_next_token(
        next_token
      ).parse

      persist_shipments_then_next(next_data)
    end
  end

更新:我从 application.rb 中删除了以下内容,它有效吗?:

RubyVM::InstructionSequence.compile_option = {
  tailcall_optimization: true,
  trace_instruction: false
}

最佳答案

您需要为递归函数调用设置某种终止条件。您已将该条件设为 unless next_token.nil?,但您确定 next_token 在您尝试终止时变为 nil,可能您只需要执行 除非 next_token

def persist_shipments_then_next(prev_data)
  persist_shipments(prev_data)

  next_token = prev_data['NextToken']
  unless next_token
    next_data = @client.list_inbound_shipments_by_next_token(
      next_token
    ).parse

    persist_shipments_then_next(next_data)
  end
end

关于ruby-on-rails - 堆栈级别太深,即使递归调用在函数末尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40797149/

相关文章:

ruby-on-rails - rails 多态 url 参数

ruby - Rack::Server.build_app 如何添加中间件?

ruby - 删除一行中的第一个和最后一个数组元素?

sql - 如何在递归SQL查询中找到子树中的所有节点?

c - 递归二进制搜索函数缺少什么? (C)

ruby-on-rails - 如何查看我的环境变量?

ruby-on-rails - 在 GitHub 上测试 fork 的 ruby​​ gems/插件

ruby-on-rails - 如何通过 gem OmniAuth Facebook/Twitter 注销社交网站

ruby-on-rails - 无法安装 Nokogiri gem

haskell - 返回一个列表,其中包含一对元素,但前提是各个元素的总和是奇数