【问题标题】:How can I "close" an enumerator in Ruby?如何在 Ruby 中“关闭”枚举器?
【发布时间】:2018-02-23 15:32:54
【问题描述】:

我有一个循环访问来自外部 API 的数据的枚举器。当我完成循环时,API 请求我通知它。当枚举器被允许去直到它用完数据时,这很容易:

def api_enum
  return enum_for(:api_enum) unless block_given?
  loop_on_api_calls { |thing| yield thing }
  notify_api_that_i_am_done
end

但是这个案子呢?

api_enum.each do |thing|
  do_stuff(thing)
  break
end

break 表示我永远不会打电话给notify_api_that_i_am_done。我如何构建它以保证notify_api_that_i_am_done 被调用?这有什么好的模式吗?

【问题讨论】:

  • break notify_api_that_i_am_done 有什么问题?
  • @spickermann 老实说,我不知道那是一回事。

标签: ruby enumerable enumerator


【解决方案1】:

你可以只用参数调用break

api_enum.each do |thing|
  do_stuff(thing)
  break(notify_api_that_i_am_done)
end

【讨论】:

    【解决方案2】:

    在您的api_enum 方法中,您可以使用ensure 始终执行清理代码,而不管抛出任何异常或用户breaking。这对于任何清理代码都是一个好主意,因为只有这样才能确保我们运行它,即使在用户提供的块中引发了异常。

    可以这样使用:

    def api_enum
      return enum_for(:api_enum) unless block_given?
      loop_on_api_calls { |thing| yield thing }
    ensure
      notify_api_that_i_am_done
    end
    

    使用该模式,您无需遵循任何特殊的调用约定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 2012-11-01
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 2015-01-12
      • 2010-09-09
      相关资源
      最近更新 更多