Ruby 的 Enumerator 对象如何在内部迭代器上进行外部迭代?

2023-12-24

根据 Ruby 的文档,Enumerator 对象使用each方法(枚举)如果没有提供目标方法to_enum or enum_for方法。现在,让我们以下面的猴子补丁及其枚举器为例

o = Object.new
def o.each
    yield 1
    yield 2
    yield 3
end
e = o.to_enum

loop do
  puts e.next
end

鉴于 Enumerator 对象使用each何时回答的方法next被调用,如何调用each方法看起来像,每次next叫做? Enumeartor 类是否预加载了所有内容o.each并创建一个本地副本进行枚举?或者是否有某种 Ruby 魔法可以在每个yield 语句处挂起操作,直到next被调用到枚举器上?

如果制作了内部副本,那么它是深副本吗?可用于外部枚举的 I/O 对象又如何呢?

我正在使用 Ruby 1.9.2。


这并不完全是魔法,但它仍然很美丽。不是制作某种副本,而是Fiber http://www.ruby-doc.org/core-1.9.3/Fiber.html用于首先执行each在目标可枚举对象上。收到下一个对象后each, the Fiber产生这个对象,从而将控制权返回到Fiber最初已恢复。

它很漂亮,因为这种方法不需要可枚举对象的副本或其他形式的“备份”,正如人们可以想象的那样,例如通过调用#to_a于可数。与纤程的协作调度允许在需要时准确地切换上下文,而不需要保持某种形式的前瞻。

这一切都发生在C code https://github.com/ruby/ruby/blob/trunk/enumerator.c#L546-L605 for Enumerator。显示大致相同行为的纯 Ruby 版本可能如下所示:

class MyEnumerator
  def initialize(enumerable)
    @fiber = Fiber.new do
      enumerable.each { |item| Fiber.yield item }
    end
  end

  def next
    @fiber.resume || raise(StopIteration.new("iteration reached an end"))
  end
end

class MyEnumerable
  def each
    yield 1
    yield 2
    yield 3
  end
end

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

Ruby 的 Enumerator 对象如何在内部迭代器上进行外部迭代? 的相关文章

  • 使用复选框过滤列表

    我有一个电影列表及其评级 在我的页面顶部 我有一个表单 其中提供了一个复选框列表 其中显示了每个可用的评级 G PG 13 等 一旦用户单击复选框并点击提交 我只想显示所选的电影 在我的索引方法中 我有一个名为的实例变量 filtered
  • 回形针不支持 .doc 文件

    在 Rails 4 0 2 中 我使用回形针 gem 上传文件 但它不支持 doc 文件 在文件上传字段下方 显示一条错误消息 扩展名与其内容不匹配 在模型中 检查内容类型的验证如下 validates attachment content
  • 两个 ruby​​ 进程之间的通信可能/容易吗?

    如果我有一个 ruby 脚本Daemon顾名思义 它作为守护进程运行 监视系统的某些部分并能够执行需要身份验证的命令 例如更改权限 是否有一种简单的方法来拥有第二个 ruby 脚本 例如client 与该脚本通信并向其发送命令 询问信息 我
  • 检查rails devise ldap gem中的组成员身份,是否在yaml中?

    我是否应该使用 ldap yml 文件来确保使用 ldap 进行身份验证的人拥有分配给他们的正确组以允许他们进入 无论如何 我都不是 AD 专业人士 这让我很困惑 什么是组和属性 据我了解 我们在 AD 中有一个用户 他们有一个 samAc
  • Emacs、ruby:将 do 结束块转换为大括号,反之亦然

    我经常发现自己转换这样的代码 before do something end to before something 有没有办法在 emacs 中自动执行此任务 我使用 ruby mode 和 rinary 但它们在这里没有太大帮助 rub
  • 在 mac os Sierra 上,卡在“设置 CocoaPods 主存储库”上

    转移到 mac os sierra 后 我完全格式化了我的 mac 现在每次运行时我都面临安装 cocoapods 的问题sudo gem install cocoapods pre一切都安装得很好 当我尝试安装 Pod 时 终端堆栈打开S
  • 将 Rack::Deflater 插入机架中的哪个位置?

    我目前有以下内容 use Rack Rewrite use Rack Cache verbose gt true metastore gt memcached localhost 11211 rack cache meta entityst
  • 用于验证目的的动态查找方法

    我正在使用 Ruby on Rails 3 0 7 我想在运行时查找一些记录以进行验证 但为该查找方法传递 设置一个值 也就是说 在我的班级中 我有以下内容 class Group lt lt ActiveRecord Base valid
  • 随机采样数组的唯一子集

    如果我有一个数组 a 1 2 3 如何随机选择数组的子集 以使每个子集的元素都是唯一的 也就是说 对于a可能的子集是 1 2 3 1 2 2 3 1 2 3 我无法生成所有可能的子集 因为 a 的实际大小非常大 因此有很多很多子集 目前 我
  • 回形针:样式取决于模型(has_many 多态图像)

    我已将模型设置为使用多态图像模型 这工作正常 但是我想知道是否可以更改每个模型的 styles 设置 找到了一些使用 STI 模型 Art has many images as gt imageable Image belongs to i
  • 一对一的DataMapper关联

    我对 DataMapper 非常陌生 我正在尝试为以下场景创建模型 我有许多用户 有用户名 密码等 他们也可以是玩家或裁判员或两者兼而有之 因此单表继承不是一个选项 基本模型是 class User include DataMapper R
  • 何时使用node.js、sinatra、rails? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这 3 种语言 框架的最佳用途是什么 混合所有 或 2 个 有用吗 如果您正在构建一个完整的 Web 应用程序 您可能应该使用 Rails 因为
  • 生成源映射时出错 - grunt 和 sass 配置

    我正在尝试将 sass 与 grunt 一起使用 我已经在我的路径中安装了 ruby sass 和 grunt 版本是 节点 0 10 20npm 11 3 1grunt cli 0 1 13咕噜声 0 4 5萨斯 3 4 4 我的包 js
  • 使用 Mechanize (Ruby) 进行基本身份验证和表单身份验证

    我正在尝试登录公司内部网上的一个站点 该站点具有基本身份验证弹出对话框和基于表单的身份验证 这是我正在使用的代码 导致 401 gt Net HTTPUnauthorized 错误 require rubygems require mech
  • Ruby 在 Windows 上找不到 sqlite3 驱动程序

    我正在尝试在 Windows 上设置 Ruby on Rails 我正在使用看起来不错的 Flash Rails 发行版 但是 sqlite3 有一个问题 我发现线程告诉我安装版本 1 2 3 安装得很好 我使用的是 ruby 1 9 0
  • 从 float 转换的 Ruby Time 对象不等于原始 Time 对象

    time Time now fvalue time to f return time Time at fvalue 有人可以解释为什么上面的表达式返回 false 吗 如何从 float 创建一个与原始时间变量匹配的新 Time 对象 Th
  • HMC SHA1 哈希 - C# 生成与 Ruby 不同的哈希输出

    我正在尝试为我正在使用的第三方服务快速获取一个有缺陷的 Net 客户端库 原始库 可以运行 是用 Ruby 编写的 但 DotNet 的等效库会向 Ruby 库生成不同的哈希输出 Ruby加密代码如下 def self encrypt st
  • 未知属性:user_id

    我在执行 current user stories build 期间收到错误未知属性 user id class User lt ActiveRecord Base has many stories class name Story for
  • ubuntu 12.04 ruby​​ 2.0 Rails:找不到“thread_safe”

    我正在 ubuntu 12 04 上安装 Rails 使用以下方法手动安装 如何在 Ubuntu 12 04 上正确安装 ruby 2 0 0 https stackoverflow com questions 16222738 how t
  • Cucumber / Savon 省略或删除日志输出

    在运行黄瓜测试时 我得到 除了测试结果之外 许多与调试 日志相关的输出 格式如下 D 2013 03 06T12 21 38 911829 49031 DEBUG SOAP request D 2013 03 06T12 21 38 911

随机推荐

  • FFmpeg-Python 音频在最终视频中丢失

    我试图将视频放置在背景图像之上 但生成的输出视频没有音频 有什么办法可以让音频保持原样吗 def ConvertVideo source background start end dest stream ffmpeg input sourc
  • 奇怪的 while 语句行为?

    我不明白为什么以下陈述不起作用 randomKey random choice list topic keys randomValue random choice topic randomKey current len randomValu
  • 在一个 Android 应用程序中拥有多个 SQLiteOpenhelper

    我想知道是否可以在同一个 Android 应用程序中拥有多个 DbOpenHelper 但使用它们在同一个数据库中写入和读取 因为我试图从 2 个不同的 OpenHelper 具有不同的名称 创建表 但似乎只有第一个可以创建 当我尝试运行第
  • CKNotificationInfo soundName 不起作用

    Sbuscription 的创建如下 可以用 但是没有声音 为什么 医生说 if you specify the string default for this property the system plays the default a
  • 如何在Java中获取特定年份的所有星期日的日期?

    我正在认真寻找这段代码 我是新程序员 实际上我想让所有日期都带有标志 这些日期都是特定年份的星期日 请 我热切地等待您的回复 创建一个新日历 将时间设置为 1 1 yyyy 和某个时间 检查当前日期是否为星期日 然后向前滚动一天 直到星期日
  • 如何让 djangorestframework 使用格式后缀返回 xml?

    我可以让 djangorestframework 通过格式后缀 json 返回 json 但不能通过 xml 后缀返回 xml http 127 0 0 1 8000 chat rooms json id 1 timestamp 2013
  • memmem() STL 方式?

    是否有 STL 算法可用于像 memmem 一样搜索缓冲区内的字节序列 我不知道这是否是好的代码 但是以下代码可以使用std search http www cplusplus com reference algorithm search
  • Xcode 4.2 中的未知类型名称“命名空间”

    我正在编译QCAR SDK 但是当我向项目中添加更多框架后 它提示错误 Matrices h ifndef QCAR MATRIX H define QCAR MATRIX H namespace QCAR Matrix with 3 ro
  • PHP MP3 标签处理

    我有一个 php 脚本 我想提供其中的音乐列表 这些文件被命名为 01 mp3 02 mp3 和 03 mp3 等 他们都有标签信息 我的问题是如何在我的 php 脚本中访问它 您需要一个脚本来解析 mp3 文件以访问数据 来自谷歌 htt
  • 增量附加 numpy.arrays 到保存文件

    我已经尝试过 Hpaulji 概述的这种方法 但它似乎不起作用 如何在python中将多个numpy文件附加到一个numpy文件中 https stackoverflow com questions 42204368 how to appe
  • 在文本字段 Flutter 内部添加阴影

    我有这个设计 我想将其用于我的应用程序 但我不太确定如何添加框阴影 阴影位于文本字段的内部 请问有人可以给我一些帮助并为我指出如何执行此操作的正确方向吗 文本字段顶部的框阴影 干杯 杰克 您可以使用容器作为背景来实现这一点 例如使用线性 坡
  • 列表框 itemtemplate 内的绑定问题

    我有两个单独的列表框绑定问题 其中的 itemtemplate 包含一个文本框 1 一个列表框绑定到一串字符串 如何在创建的文本框中显示每个字符串并同时允许两种方式绑定 如果不指定 Path 或 XPath 则不允许进行双向绑定
  • NHibernate 从 SymbolSource.org 加载符号

    我希望能够调试 NHibernate 但我从未加载过任何符号SymbolSource org前 我需要在 Visual Studio 中输入什么 url 才能加载 NHibernate 的符号 以便我可以正确调试它 我正在运行 NHiber
  • 当内容扩展超过窗口大小时,在绝对定位元素上设置 100% 高度

    因此 在阅读 Stack Overflow 和网络之后 我发现实现 100 高度有两个主要技巧 在 HTML 和 BODY 上设置 height 100 Set your element to have either 高度 100 或 顶部
  • 无法以编程方式滚动到 JList 中的最后一项

    我有一个 JList 嵌套在 JScrollPane 中 当我向 JList 添加项目时 我希望 JScrollPane 自动滚动到 JList 的底部 以便最后一个项目可见 为此 我有以下代码 getWordListScroller ge
  • 在 Go 中要求 HTTP 基本身份验证的惯用方式?

    情况 我正在使用 Gorilla 的 mux 作为路由器构建 REST API 我想知道如何使用简单的 HTTP 基本身份验证来保护特定路由 我不需要从文件或任何外部源读取凭据 我真的只想通过硬编码的 HTTP 基本身份验证用户名和密码来保
  • ANTLR 入门并避免常见错误

    我已经开始学习 ANTLR 并且拥有 2007 年的书 The Definitive ANTLR Reference 和 ANTLRWorks 用于创建语法的交互式工具 而且 作为这样的人 我从第三章开始 针对不耐烦的人的快速浏览 这是一个
  • PBS 上的 Python 脚本失败,并显示错误 =>> PBS:作业被终止:ncpus 37.94 超出限制 36(总和)

    当我在 PBS 调度程序上运行 python 脚本 使用 Miniconda 时 出现标题中提到的错误 我认为 numpy 正在做一些多线程 处理 但我无法阻止它这样做 我将这些行添加到我的 PBS 脚本中 export MKL NUM T
  • 如何在 JAX-RS 中映射动态 JSON

    我必须使用 JAX RS Resteasy 作为实现 将 JSON 映射到 Java PoJos 问题是 JSON 是动态的 看这个例子 typeCode SAMPLE data id COMMENTS answerValue type Y
  • Ruby 的 Enumerator 对象如何在内部迭代器上进行外部迭代?

    根据 Ruby 的文档 Enumerator 对象使用each方法 枚举 如果没有提供目标方法to enum or enum for方法 现在 让我们以下面的猴子补丁及其枚举器为例 o Object new def o each yield