如何证明 Ruby 的“for”循环实际上是使用“each”方法实现的?

2023-12-12

在书里Eloquent Ruby(第 21 页,第一版,第六次印刷),作者(Russ Olsen)主张使用each方法而不是for循环,这与我在其他地方读到的所有内容一致。

然而,作者还接着说,这样做的原因之一是for循环实际上调用了each方法,那么为什么不直接去掉中间人并使用each?所以我想知道这实际上是如何运作的。

为了进行调查,我确实在 github 上的 Ruby 存储库上进行了搜索,但发现很难确定在哪里/如何看到它的实际情况。

重申一下问题:

我怎样才能显示红宝石for循环实际上是使用each method?


您可以通过编写一个实现每个的类来展示它:

# Demo that for calls each

class ThreeOf
  def initialize(value)
    @value = value
  end

  def each(&block)
    puts "In Each"
    block.call(@value)
    block.call(@value)
    block.call(@value)
  end
end

然后创建一个实例并在 for 循环中使用它:

collection = ThreeOf.new(99)

for i in collection
  puts i
end

运行它,您将看到打印出的消息,并且 for“循环”将循环三遍。

或者(更有趣)你可以猴子修补内置的 Array 类:

class Array
  alias_method :orig_each, :each

  def each(*args, &block)
    puts "Array Each called!"
    orig_each(*args, &block)
  end
end

puts "For loop with array"
for i in [1,2,3]
  puts i
end

您将再次看到打印的消息。

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

如何证明 Ruby 的“for”循环实际上是使用“each”方法实现的? 的相关文章

随机推荐

  • 将数组转换为 JSON

    我有一个数组var cars 2 3 其中包含一些整数 我已经向数组添加了一些值 但现在需要通过 jQuery 将此数组发送到页面 get方法 如何将其转换为 JSON 对象进行发送 向后兼容的脚本 https github com dou
  • 解析性能(If、TryParse、Try-Catch)

    我了解很多处理解析文本以获取信息的不同方法 例如 对于解析整数 可以预期什么样的性能 我想知道是否有人知道这方面的任何好的统计数据 我正在从测试过这个的人那里寻找一些真实的数字 其中哪一个在哪些情况下提供最佳性能 Parse Crash i
  • 是否有任何浏览器(Chrome、Firefox)插件​​可以模拟地理位置?

    我需要测试广泛使用地理定位 api getCurrentPosition watchPosition 的 Web 应用程序 是否有任何浏览器 Chrome Firefox 插件 可以模拟地理位置 我来晚了一点 但是微软边缘有这个有用的选项卡
  • Java JTextPane JScrollPane 显示问题

    下面的类实现了一个 chatGUI 当它运行正常时 屏幕如下所示 精美 ChatGUI http img21 imageshack us img21 7177 rightchat jpg 当我输入大长度的文本时 问题经常出现 50 100
  • 将函数应用于大小相等的连续子向量

    我正在寻找一种很好且快速的方法来应用一些对向量进行操作的任意函数 例如sum 连续到连续 K 个元素的子向量 这是一个简单的例子 它应该非常清楚地说明我想要什么 v lt c 1 2 3 4 5 6 7 8 v2 lt myapply v
  • 在Delphi中将多维数组作为参数传递

    我想将多维数组传递给构造函数 如下所示 constructor TMyClass Create MyParameter array of array of Integer begin LocalField MyParameter end 其
  • 改造响应问题

    我正在尝试通过改造获取状态列表并尝试添加可搜索微调器 我得到什么 我收到了回复中的州列表 I can access one state in Spinner What i want 我想访问 Spinner 中的多个状态 Code getM
  • C# Office 2010 自动化

    我正在尝试制作一个程序 将数据插入到现有Word文档中的特定位置并保存它的副本 我不知道如何做到这一点 而且我找不到任何关于 Office 2010 自动化的好资源 谁能指出我正确的方向和 或给我一些例子 提前致谢 找到解决方案稍后添加答案
  • 硬币交换变体的动态规划解决方案

    我正在练习动态规划 我关注的是硬币兑换问题的以下变体 Let S 1 2 6 12 24 48 60 是整数硬币面额的常数集 让n是通过硬币可获得的正整数金额S 考虑两个人A and B 我可以用多少种不同的方式来分割n人与人之间A and
  • 在进行未更改的合并时,文件被列为挂起的更改?

    我们已经发生过多次这样的情况 我们认为这不仅仅是侥幸 当我们完成分支后合并回来时 会有比应有的更多的更改 因此 大多数显示为挂起更改的文件从未更改 在大多数情况下 既不在分支也不在基础 当我比较它们时 我使用超越比较 没有差异 我没有浏览所
  • 在数据库中存储字符串数组

    我有一个通过 ORM 保存到数据库的对象 该对象有一个字符串数组 每个对象的数组长度可能不同 我想知道在数据库中存储字符串数组的标准做法 例如 我应该将所有字符串存储在一个字段中作为 csv 等 我猜你有一个 MySql 关系数据库 作为第
  • 使用 OpenCV 和 ffmpeg 后端编码 HEVC 视频

    我尝试使用带有 ffmpeg 后端的 OpenCV 和 Python3 将网络摄像头编码为 HEVC 视频 它可以与其他编解码器配合使用 例如mjpg 这是我的示例脚本 它使用相应的fourcc 也尝试过hevc h265 x265 etc
  • 将 Joda LocalDate 或 java.util.Date 转换为当天开始时的 LocalDateTime

    我使用的是乔达2 5 将 Joda LocalDate 转换为 LocalDateTime 时遇到问题 因为 我可以将 LocalDate 转换为 DateTime 时间为 StartOfDay 我想要相同的功能 但通过 LocalDate
  • Struts2 devMode 在提交标签中使用“key”属性时出现异常

    我正在使用 Struts2devMode打开以捕获尽可能多的警告和错误 现在我遇到了一些仅在 devMode 中通知的严重通知 我正在使用submit标签 我包括key获取按钮文本的属性 Entrar 来自一个名为global BOTON
  • 如何将库添加到 Eclipse CDT? (没有这样的文件或目录)

    我在添加标头库时遇到一些问题 我右键单击我的项目 然后单击属性 gt C C 常规 gt 路径和符号 In the Includes tab 语言 gt GNU C 我点击添加 gt 文件系统然后添加名为 boost 1 52 0 的文件夹
  • Python tkinter mainloop 在关闭窗口时不退出

    我是编程和 Python 新手 正在制作一个计算器应用程序来练习 我正在使用 Tkinter 和 Python 2 7 该应用程序具有您所期望的各种按钮 以及用于显示数字 结果的条目和标签小部件 我认为我的程序确实启动了主循环 但关闭窗口并
  • 如何在Android中对组和子项可扩展列表视图进行排序?

    我在mysql中有两个表 它们通过id id catprods 和 ID Cat 绑定 类别 和 产品 到目前为止 一切顺利 我正在 Android 上使用 ExpandableListView 和自定义适配器 一切正常 但找不到用其产品对
  • 在 R 中的条形图上命名 x 轴

    我正在尝试在 R 中绘制条形图 我有 2 个向量 x lt c 1 2 3 4 y lt c 200 400 4000 255 A lt rbind x y to make it into a matrix barplot A ylim c
  • 为什么php中3个反斜杠等于4个反斜杠?

    为什么PHP中带有3个反斜杠的字符串等于带有4个反斜杠的字符串 我们可以在正则表达式中使用 3 个反斜杠版本吗 The PHP 参考说我们必须使用 4 个反斜杠 笔记 单引号和双引号 PHP 字符串具有反斜杠的特殊含义 因此如果 必须与正则
  • 如何证明 Ruby 的“for”循环实际上是使用“each”方法实现的?

    在书里Eloquent Ruby 第 21 页 第一版 第六次印刷 作者 Russ Olsen 主张使用each方法而不是for循环 这与我在其他地方读到的所有内容一致 然而 作者还接着说 这样做的原因之一是for循环实际上调用了each方