如何在 Ruby 中“关闭”枚举器?

Posted

技术标签:

【中文标题】如何在 Ruby 中“关闭”枚举器?【英文标题】:How can I "close" an enumerator in 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 老实说,我不知道那是一回事。 【参考方案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

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

【讨论】:

以上是关于如何在 Ruby 中“关闭”枚举器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 3 的 Postgres 数据库中使用枚举? [关闭]

如何创建无限可枚举的Times?

帮助理解 Ruby 中的产量和枚举器

如何在 ruby​​ 中批处理枚举

使用辅助方法和 Ruby 可枚举返回 html 格式的对象

Ruby - 优雅地比较两个枚举器