我怎样才能"关闭" Ruby中的枚举器?

时间:2017-09-14 15:09:27

标签: ruby enumerable enumerator

我有一个枚举器,它循环来自外部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被调用?这有什么好的模式吗?

2 个答案:

答案 0 :(得分:0)

您只需使用参数调用break

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

答案 1 :(得分:0)

api_enum方法中,您可以使用ensure始终执行清理代码,无论是否抛出任何异常或用户break。这对于任何清理代码都是一个好主意,因为只有这样,即使在用户提供的块中引发异常,你也可以确保它运行。

可以这样使用:

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

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