有没有办法在循环内部知道您是否处于最终迭代?

2023-12-23

在迭代数组(或任何其他可枚举)时,是否有任何干净且简单的方法可以知道您是否处于最终迭代?

例如,在 Rails 视图中,您可能要显示一组内容,并且您可能希望在它们之间放置一条水平线,但不要在每个内容之前,也不要在每个内容之后。仅限于他们之间。我确信还有许多其他可能的用途,但这是我认为最常见的用途:显示某些内容between收集项目本身的数据。

我很确定除了切换之外没有其他办法each to each_with_index or each.with_index并在迭代外部添加一个变量来获取项目总数,然后在块的末尾进行检查。

既然看起来very不太可能有一个内置的方法可以做到这一点each,是否可以创建一个方法来为您提供这种能力,而无需在迭代之外添加代码?最简单的形式(这不完全是我想要的,但可能是朝着正确方向迈出的一步)可能是这样的

people.each.with_count.with_index(1) do |person, count, index|
  # ...
  do_something_in_between if index < count
end

但我实际上更喜欢类似的东西

people.each do |person|
  # ...
end.between do
  do_something_in_between
end

有可能做到这一点吗?


如果您不想使用计数器或生成的偏移量,您可以执行如下操作。

people = %w|Lily Bob Suzie|
  #=> ["Lily", "Bob", "Suzie"]
enum = people.each.with_index(1)
  #=> #<Enumerator: #<Enumerator: ["Lily", "Bob", "Suzie"]:
  #     each>:with_index(1)> 
loop do
  name, nbr = enum.next
  print "name=#{name}, nbr=#{nbr} is "
  puts (enum.peek rescue nil) ? "not last" : "last"
end

displays

name=Lily, nbr=1 is not last
name=Bob, nbr=2 is not last
name=Suzie, nbr=3 is last

See 枚举器#next https://ruby-doc.org/core-2.6.3/Enumerator.html#method-i-next and 枚举器#peek https://ruby-doc.org/core-2.6.3/Enumerator.html#method-i-peek. peek如果有,则返回要生成的下一个元素,否则会引发StopInteration例外(即,如果之前的next生成最后一个元素)。我用过内联rescue返回条款nil if peek引发异常。

只为营救StopInteration产生的异常peek(并且还允许people包括对象false and nil,尽管这与当前上下文无关),我们可以使用begin/rescue/end构造:

enum = people.each.with_index(1)
loop do
  print "name=%s, nbr=%d is " % enum.next
  begin
    enum.peek
    puts "not last"
  rescue StopIteration
    puts "last"
  end
end

我们依靠enum.next生成一个StopIteration当枚举器生成所有元素后执行该异常。内核#循环 https://ruby-doc.org/core-2.6.3/Kernel.html#method-i-loop通过跳出循环来响应该异常。是因为enum.next不能在begin/rescue/end clause.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法在循环内部知道您是否处于最终迭代? 的相关文章

  • Rails 3 分页,will_paginate 与 Kaminari

    我的设置 Rails 3 0 9 Ruby 1 9 2 我正在为我的应用程序寻找分页解决方案 发现有一个新的宝石Kaminari与值得信赖的人相比will paginate 看起来像will paginate有一段时间没有更新了 但后来又以
  • Devise:允许用户注册为“UsErNaMe”但使用“用户名”登录

    与大多数网站的工作方式相同 我将 UsErNaMe 存储在数据库中 但让用户使用 用户名 登录 这是一个相当明显且必要的功能 很多人似乎都问过它 但我不断遇到的解决方案似乎与 Devise 自己的文档脱节 例如 考虑这篇博文 http an
  • 由于 MIME 类型不受支持,拒绝应用样式

    我不断收到一条错误消息 指出 MIME 类型 text html 不可执行或不是受支持的样式表 MIME 类型 并且启用了严格的 MIME 检查 我的链接代码是
  • 用于获取下周一(或一周中的任何一天)的日期的 Ruby 代码

    给定一个输入 例如 day Monday 我如何计算下一次的日期day def date of next day end require date def date of next day date Date parse day delta
  • 如何从数组中提取特定元素?

    如果我有一个数组a 1 2 3 4 5 6 7 8 9 10 我想要这个数组的一个子集 第 1 个 第 5 个和第 7 个元素 是否可以通过简单的方式从该数组中提取这些内容 我在想这样的事情 a 0 4 6 1 5 7 但这行不通 还有一种
  • 如何使用国家宝石

    我正在尝试使用国家宝石 https github com hexorx countries 但是在我捆绑安装这个 gem 后 有一些关于如何合并它的基本问题 我是否需要创建新的控制器 模型才能访问这些国家 地区 如何创建一个简单的选择下拉列
  • Rails3/will_paginate/Ajax - 下一个/上一个链接无法正常工作(这是一个错误吗?)

    我正在遵循 使用ajax分页 http railscasts com episodes 174 pagination with ajax railscast 用于我的 Rails 3 应用程序 一切似乎都运行良好 除了上一个和下一个链接根本
  • 自动加载常量时检测到循环依赖

    我将 Rails 从版本 3 1 2 运行良好 升级到 4 0 并遇到以下错误 circular dependency detected while autoloading constant Foo 我创建了一个类ProductFactor
  • <%=h ... %> 在 Rails 中意味着什么?

    I found here http api rubyonrails org classes ActionView Helpers RecordTagHelper html以下语法 什么是h means 它用于转义标签的输出以避免跨站点脚本
  • Rails content_for 和yield 之间有什么区别?

    例如 content for stuff vs yield stuff 我知道它们的实现略有不同 但是有任何真正的功能差异吗 是否有普遍接受的最佳实践 yield是您指定内容区域在布局中的位置的方式 你可能有这样的事情 div h1 Thi
  • Gem 在 irb 中可用,但在 Rails 控制台中不可用

    我正在尝试在我的 Rails 项目中使用 RedCloth gem 当我使用irb我可以加载宝石 require rubygems require RedCloth 它工作正常 但是当我在 Rails 控制台中尝试相同的操作时 我收到一条错
  • 使用 Mountain Lion、Xcode 4.5 和 RVM 安装 Ruby?

    rvm install 1 9 3 with gcc clang 根据建议无法使用 RVM 在 Lion 下安装 Ruby GCC 问题 https stackoverflow com questions 8032824 cant inst
  • 如何在 Ruby 中重写 require ?

    我需要覆盖require来自 Ruby 文件 这是我的 start rb 应用程序入口点 所必需的 rubygems在此之前加载 位于 start rb 中 我尝试的所有操作都出现了堆栈溢出错误 正确的做法是什么 一般来说 如果你想修补一些
  • 认为 Sphinx 没有为新添加的记录建立索引

    我正在使用 sphinx 搜索 2 个模型及其关联 我正在使用增量索引 在我的开发盒上 在开发模式 Ubuntu 下一切正常 但是 在暂存盒生产环境中 当我创建新记录时 我需要再次构建索引以使新创建的记录可搜索 甚至奇怪的是 当我使用脚本
  • 使用 Ruby 重命名 S3 中的对象

    我想使用 Ruby sdk 重命名 s3 中的项目 我该怎么做呢 我努力了 require aws sdk s3 AWS config region gt region access key id gt key secret access
  • Rails 中过滤长日志参数

    我允许用户在我的网站上上传文件 其中一些文件可能非常大 并且占用了我的日志文件的很大一部分 所以我不想让它出现 我知道 config filter parameters password 过滤某些参数 但问题是参数位于这样的哈希中 pers
  • Rails 基本 Base64 身份验证

    我正在尝试复制此 GET curl 请求 curl D X GET H Authorization Basic dGVzdEB0YXByZXNlYXJjaC5jb206NGMzMTg2Mjg4YWUyM2ZkOTY2MWNiNWRmY2Nl
  • 在 Rails 中使用 gem 时,“无法删除 Object::ClassMethods”源于什么?

    我在安装 gems 时经常遇到这样的问题 有谁知道这源于什么 我见过几个不同的案例 但仍然不知道到底是什么原因造成的 sudo rake gems install trace in u app releases 20100213003957
  • 如何调试速度慢得难以忍受的 Rails 资源预编译

    我正在开发一个 Rails 3 2 项目 尽管我不认为该项目很大 但近几个月来资产已经增加了相当多 资产由 JS 无咖啡脚本 和 SASS 文件组成 我们有很多图像 但从早期开始 它们出现的次数就更少了 所以我认为它们不是一个重要因素 我们
  • Rails CSS 样式表相互覆盖

    我在资产 样式表位置有一个clients css和jobs css 每个都有一个各自的控制器 乔布斯是在客户之后用脚手架创造出来的 scaffolds scss 文件为空 application css 为空 当我编码更改时 例如body

随机推荐

  • 获取 LinkedHashSet 的最后一个

    我想存储数字 1 2 3 4 的列表 让我们从List
  • Proguard 保留接口方法参数名称

    我使用 keepparameternames 但它不响应界面 The interface s methond parameter is proguard Thank you for your help Proguard 可以很好地保留参数名
  • LISTAGG 奇怪的串联[重复]

    这个问题在这里已经有答案了 当我使用下面的查询来获取所需的详细信息时 SELECT USERNAME FULLNAME DEPARTMENT LISTAGG TASKNAME WITHIN GROUP ORDER BY TASKNAME T
  • 如何在 Xamarin 中获取 GoogleApiClient?

    我想实现类似的东西this https stackoverflow com a 25173057 2611340在我在 Xamarin 中开发的 Android 应用程序中 但找不到其中的命名空间GoogleApiClient是 有人可以帮
  • Blackberry OS 4.5 应用程序的通知服务

    我正在开发一个类似于电子邮件应用程序的应用程序 每当收到新消息时 我的通知服务应通过更新图标向用户指示更改 此外 通知服务应持续侦听服务器的传入事件 我正在使用 4 5 版本的操作系统进行开发 RIM OS 您有多种选择来通知 用户 都不是
  • 如何将 Google 地图标记链接到其他元素?

    使用谷歌地图 http code google com apis maps documentation reference html 和 JavaScript 我已经能够轻松地显示几个标记 每个标记上都有一个漂亮的小信息窗口 Create
  • 关闭 Cypress 中的 Angular 材质对话框

    我正在将 Cypress 添加到我的 Angular 6 项目中 并使用 Angular Material 欢迎新用户使用材质对话框 其中包含 iFrame 并且通过单击对话框外部来关闭该对话框 我尝试通过多种方式在 Cypress 中关闭
  • ng2-charts 更新标签和数据

    我正在尝试使用 ng2 chart 动态创建图表 我从 Angular 2 服务获取信息 当我仅更改图表标签时 它有效 当我更改数据时 它仅有效 但是当我更改两者时 仅数据在图表中更新 有人可以解释一下这种奇怪的行为吗 我的模板
  • 连接关闭后 Socat 终止

    此命令 串行端口重定向器 接受 TCP 11313 上的单个连接 socat PTY link dev ttyV1 echo 0 raw unlink close 0 TCP LISTEN 11313 forever reuseaddr 但
  • AngularJS ui-router,滚动到状态更改的下一步

    我在我的应用程序中使用 UI router 当 URL 状态更改时 我想使用一个简单的 scrollTo 到锚点 我不想从模板加载下一步 或加载新的控制器 我只是希望页面上已经有几个 div 并在它们之间上下滚动 HTML 的简化视图如下所
  • `if __name__ == '__main__'` 在 javascript es6 模块中等效

    是否可以检查 JavaScript 文件是否直接运行 或者是否需要作为 es6 模块导入的一部分 例如 包含一个主脚本 main js import other if mainTest console log This should run
  • Python 日志记录:将属于一个请求的日志分组

    有没有一种方法可以对属于一个 Web 请求的 Python Web 应用程序的日志进行分组 Example 2015 02 11 13 06 32 myapp middleware MYAPPMiddleware INFO Login of
  • 当我编译时会发生什么?

    我想知道什么是编译 编译时会发生什么 我的意思是 是的 您按编译或在控制台中输入 但它在 后台 实际上做了什么 一 编译器 lexes http en wikipedia org wiki Lexical analysis来源 这意味着它将
  • 在 Perforce 集成期间忽略源文件的正确方法

    在我的主分支中有一个包含 10 个文件的更改列表 我正在尝试将其集成到开发分支中 更改列表中的所有未完成文件都应被忽略 并且不会分支到目标中 执行集成的步骤是什么 以便 Perforce 不会在目标分支中创建文件 并忽略所有未来集成的更改列
  • C#中如何强制数字在某个范围内? [复制]

    这个问题在这里已经有答案了 在 C 中 我经常必须将整数值限制在某个值范围内 例如 如果应用程序需要百分比 则用户输入的整数不得小于零或大于一百 另一个例子 如果有五个网页 通过Request Params p 我期望值从 1 到 5 而不
  • 数据库表的子类型化

    在设计数据库时 我经常听到有关子类型化表的信息 并且我完全了解它们背 后的理论 然而 我从未真正见过表子类型的实际应用 如何创建表的子类型 我正在使用 MS Access 并且正在寻找一种在 SQL 中以及通过 GUI Access 200
  • 如何通过多个属性Java8对HashMap条目值进行排序[重复]

    这个问题在这里已经有答案了 如何按多个属性对 HashMap 条目进行排序 假设我有一个键为 String 且值为 Object 的映射 Map
  • 在centos上专门在python 2.7中安装MySQLdb

    我正在使用 CentOS 版本 6 5 最终版 我目前使用的是python 2 4 在其中我可以毫无问题地使用MySQL root dedicado home digicelc public html gestion python cate
  • JUNIT:对于大量测试类仅运行一次安装程序

    我有一门课程 我用它作为单元测试的基础 在这个类中 我初始化了测试的整个环境 设置数据库映射 在多个表中输入大量数据库记录等 该类有一个带有 BeforeClass 注释的方法来执行初始化 接下来 我使用具有 Test 方法的特定类来扩展该
  • 有没有办法在循环内部知道您是否处于最终迭代?

    在迭代数组 或任何其他可枚举 时 是否有任何干净且简单的方法可以知道您是否处于最终迭代 例如 在 Rails 视图中 您可能要显示一组内容 并且您可能希望在它们之间放置一条水平线 但不要在每个内容之前 也不要在每个内容之后 仅限于他们之间