Ruby 枚举器链接

2024-05-06

在这个例子中,

[1, 2, 3].each_with_index.map{|i, j| i * j}
# => [0, 2, 6]

我的理解是,既然each_with_index枚举器链接到map, map表现得像each_with_index通过在块内传递索引,并返回一个新数组。

为了这,

[1, 2, 3].map.each_with_index{|i, j| i * j}
# => [0, 2, 6] 

我不知道如何解释它。

在这个例子中,

[1, 2, 3, 4].map.find {|i| i == 2}
# => 2

我期望输出是[2], 假如说map被链接到find, and map将返回一个新数组。

另外,我看到这个:

[1, 2, 3, 4].find.each_with_object([]){|i, j| j.push(i)}
# => [1]

[1, 2, 3, 4].each_with_object([]).find{|i, j| i == 3}
# => [3, []]

你能让我知道如何解释和理解 Ruby 中的枚举器链吗?


您可能会发现分解这些表达式并使用 IRB 或 PRY 来查看 Ruby 正在做什么很有用。让我们从以下开始:

[1,2,3].each_with_index.map { |i,j| i*j }

Let

enum1 = [1,2,3].each_with_index
  #=> #<Enumerator: [1, 2, 3]:each_with_index>

我们可以用可枚举#to_a http://ruby-doc.org/core-2.4.0/Enumerable.html#method-i-to_a (or 可枚举#entries http://ruby-doc.org/core-2.4.0/Enumerable.html#method-i-entries) 转换enum1到一个数组以查看它将传递给下一个枚举器的内容(或者传递给块,如果有的话):

enum1.to_a
  #=> [[1, 0], [2, 1], [3, 2]]

这并不奇怪。但enum1没有块。相反,我们向它发送方法枚举#map http://www.ruby-doc.org/core-2.1.1/Enumerable.html#method-i-map:

enum2 = enum1.map
  #=> #<Enumerator: #<Enumerator: [1, 2, 3]:each_with_index>:map>

您可能会认为这是一种“复合”枚举器。该枚举器确实有一个块,因此将其转换为数组将确认它将相同的元素传递到块中enum1将有:

enum2.to_a
  #=> [[1, 0], [2, 1], [3, 2]]

我们看到数组[1,0]是第一个元素enum2传递到块中。对此数组应用“消歧”来为块变量分配值:

i => 1
j => 0

也就是说,Ruby正在设置:

i,j = [1,0]

我们现在可以调用enum2通过发送方法each与块:

enum2.each { |i,j| i*j }
  #=> [0, 2, 6]

接下来考虑:

[1,2,3].map.each_with_index { |i,j| i*j }

We have:

enum3 = [1,2,3].map
  #=> #<Enumerator: [1, 2, 3]:map>
enum3.to_a
  #=> [1, 2, 3]
enum4 = enum3.each_with_index
  #=> #<Enumerator: #<Enumerator: [1, 2, 3]:map>:each_with_index>
enum4.to_a
  #=> [[1, 0], [2, 1], [3, 2]]
enum4.each { |i,j| i*j }
  #=> [0, 2, 6]

Since enum2 and enum4将相同的元素传递到块中,我们看到这只是做同一件事的两种方法。

这是第三个等效链:

[1,2,3].map.with_index { |i,j| i*j }

We have:

enum3 = [1,2,3].map
  #=> #<Enumerator: [1, 2, 3]:map>
enum3.to_a
  #=> [1, 2, 3]
enum5 = enum3.with_index
  #=> #<Enumerator: #<Enumerator: [1, 2, 3]:map>:with_index>
enum5.to_a
  #=> [[1, 0], [2, 1], [3, 2]]
enum5.each { |i,j| i*j }
  #=> [0, 2, 6]

为了更进一步,假设我们:

[1,2,3].select.with_index.with_object({}) { |(i,j),h| ... }

We have:

enum6 = [1,2,3].select
  #=> #<Enumerator: [1, 2, 3]:select>
enum6.to_a
  #=> [1, 2, 3]
enum7 = enum6.with_index
  #=> #<Enumerator: #<Enumerator: [1, 2, 3]:select>:with_index>
enum7.to_a
  #=> [[1, 0], [2, 1], [3, 2]]
enum8 = enum7.with_object({})
  #=> #<Enumerator: #<Enumerator: #<Enumerator: [1, 2, 3]:
  #     select>:with_index>:with_object({})>
enum8.to_a
  #=> [[[1, 0], {}], [[2, 1], {}], [[3, 2], {}]]

第一个元素enum8传入块的是数组:

(i,j),h = [[1, 0], {}]

然后应用消歧来为块变量赋值:

i => 1
j => 0
h => {}

注意enum8显示在三个元素中的每一个中传递一个空散列enum8.to_a,但这当然只是因为 Ruby 不知道传入第一个元素后哈希值会是什么样子。

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

Ruby 枚举器链接 的相关文章

  • 迭代两个不同长度的列表

    我有以下两个列表 nums 1 2 3 4 5 6 7 8 ltrs a b c d for x y in nums ltrs print x y 出现以下错误 c Python35 Scripts gt python listtest p
  • 了解 Scala 中的中缀方法调用和缺点运算符(::)

    我对 Scala 编程语言相当陌生 当我遵循以下网站的讲义时 我正在尝试一些萦绕在我脑海中的东西 here http horstmann com sjsu cs152 04 closures1 html 我想我无法真正理解 cons 运算符
  • 存根 include_recipe 调用以不采取任何操作,但仍将配方计为包含的内容

    我的食谱的默认食谱仅包含其他几个食谱 我知道我可以使用以下方法测试是否包含适当的食谱 expect chef run to include recipe cookbook recipe name 但是当我像这样存根 include reci
  • ruby 的 StringIO 类到底是什么?

    我想我明白StringIO有点类似于Java的StringBuffer类 但我不太完全理解 您将如何定义它及其在 Ruby 中的用途 可能的用途 只是希望能够消除我的困惑 no StringIO http ruby doc org stdl
  • Ruby 在带有偏移量的数组中查找

    我正在寻找一种以更简洁的方式在 Ruby 中执行以下操作的方法 class Array def find index with offset offset block offset 1 find block end end offset a
  • 列表值意外变化[重复]

    这个问题在这里已经有答案了 为什么是这个列表r即使我只是想更改列表 也会被更改v 即使它们不指向相同的内存位置 r v list r 2 2 1 2 8 3 10 2 1 8 4 2 4 6 4 for c a in enumerate r
  • 寻找嵌套列表中的最低值?

    我正在尝试编写一个函数 它接受一个列表并可以打印该列表中的最小整数 现在我试图弄清楚在嵌套列表中该怎么做 如果最低数字位于这些嵌套列表之一中 那么总的来说它将打印该数字 我的代码在这里 def listMin list2 3 4 2 99
  • 从类内部调用属性访问器方法[重复]

    这个问题在这里已经有答案了 我正在尝试调用我的类属性编写器之一 但由于某种原因它永远不会被调用 下面是一些代码 可以使这一点更清楚 class Test attr reader test def test val puts Called t
  • ruby 的 String .hash 方法如何工作?

    我只是红宝石的新手 我见过一个字符串方法 String hash 例如 在irb 我试过了 gt gt mgpyone hash returns gt 144611910 这个方法是如何工作的 The hash方法是为所有对象定义的 看文档
  • Ruby 可选参数和多个参数

    我试图将方法的第一个参数设置为可选 后跟任意数量的参数 例如 def dothis value 0 args 我遇到的问题是 这似乎实际上不可能 当我打电话时dothis hey how are you good 我希望它将值设置为默认值
  • RSpec 请求规范发布一个空数组

    我目前正在 Rails 中开发 API 端点 如果我需要的数据无效 我想确保端点响应具有正确的错误状态 我需要一个 id 数组 无效值之一是空数组 Valid vendor district ids 2 4 5 6 Invalid vend
  • 回滚后是否应该删除迁移

    我对 ruby 和 Rails 相当陌生 刚刚开始了解迁移 我的问题是回滚后删除迁移的最佳实践或正确时间是什么 到目前为止 我读到的内容是回滚后是否删除迁移的观点问题 但是在团队中工作时删除迁移是否有任何重大影响 以及保留迁移文件相对于删除
  • 下载所有 gems 依赖项

    我想通过下载任何所需的文件并将它们带到另一台计算机来安装指南针没有互联网连接 我已经下载了指南针的源包 当我在未连接的计算机上运行 gem 时 它抱怨缺少依赖项 有什么解决办法吗 这正是我遇到的问题 经过一段时间的搜索后 我找到了一个可以使
  • 按相反顺序对列表进行排序

    我有直接顺序的列表 list1 List
  • Java排序列表

    我在java中得到了一个列表 我从 SQL 查询中获取值 public void ReloadPages throws Exception try Connection conn Framework GetDatabaseManager G
  • class_eval、class_exec、module_eval 和 module_exec 之间有什么区别?

    我正在读Module文档 但似乎无法理解它们的差异以及应该在哪里使用 怎么样eval不同于exec 我将回答比你的问题更多的内容 包括instance eval exec 在你的问题中 所有变体 instance module class
  • Python:在列表理解本身中引用列表理解?

    这个想法刚刚出现在我的脑海中 假设您出于某种原因想要通过 Python 中的列表理解来获取列表的唯一元素 i if i in created comprehension else 0 for i in 1 2 1 2 3 1 2 0 0 3
  • 在 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
  • 升级到 Rails 6 时是否有一种编程方法可以检测 Zeitwerk::NameError?

    我目前正在将旧的 Rails 应用程序迁移到 Rails 6 好像项目中有些文件和里面定义的类不一致 运行应用程序测试时我没有看到此错误 但部署后我收到如下错误 Zeitwerk NameError expected file app my

随机推荐

  • 搜索并替换字符串 t-SQL

    每个人我都试图编写一个查询来替换末尾出现的所有字符串 我有一些干扰词 确切地说是 104 个 如果它们出现在字符串末尾 则需要将其从字符串中删除 例如 两个干扰词是 Company LLC 以下是一些示例和预期输出 American Com
  • JS 按特定排序顺序排序

    我需要按特定顺序对数据进行排序 如下所示 const sortBy b a c e d const data a d e 我知道如何按升序 降序排序 console log data sort a b gt a gt b a d e con
  • 以静默方式安装应用程序,并授予 INSTALL_PACKAGES 权限

    我正在尝试将 apk 静默安装到系统中 我的应用程序位于 system app 并成功授予权限 android permission INSTALL PACKAGES 但是我在任何地方都找不到如何使用此权限 我尝试将文件复制到 data a
  • UITextView 格线背景但行高错误

    我有一个 UITextView 用户可以在其中创建注释并保存到 plist 文件中 我希望能够像普通笔记本一样显示线条 我遇到的问题是 文本无法正确对齐 下图很好地解释了这个问题 This is the background I use t
  • Google 脚本图表默认排除标题

    使用以下脚本 function chartCreation var ss SpreadsheetApp getActive var sheet ss getSheetByName Sheet1 var chart sheet newChar
  • IBM.EntityFrameworkCore - 未调用 DbContext.OnConfiguring 和 DbContext.OnModelCreating

    一旦我解决了一期 https stackoverflow com questions 45782871 net standard 2 0 entityframeworkcore db2 ibm entityframeworkcore iss
  • Google Apps 脚本无法从托管的 GAS 转换为特定的云项目

    我有一个 GAS 管理的项目 我想将其转换为特定的谷歌标准云项目 我有身份证 我将其输入到资源 云托管项目中 然后得到 项目不存在 或者您需要对其进行编辑访问 它确实存在 并且我拥有权限 因为我是所有者 该错误有些误导性 我花了一段时间才弄
  • 通过相同的 Makefile 生成 Makefile 的包含文件

    在我的程序中 我有一个有点复杂的构建过程 目前 在我使用的一个目录中include in Makefile am对于一个文件 该文件不存在 但必须自行构建 原因是这个包含文件相当长 此外 在实际程序中 它不仅仅是一个文件 而是多个文件 并且
  • JBoss 7.2 版本使用什么日志记录?

    java 中可以使用多种日志记录变体 最流行的是 log4j 和 JDK 日志记录 我想知道 JBoss Application Server 7 2 版本默认使用什么日志记录 通过查看模块或配置文件很难找到所使用的记录器 如果有人可以在这
  • 在什么情况下会在快速测试中使用expectationForNotification

    我有点困惑什么 什么时候做expectationForNotification as opposed to期望与描述 我无法在 swift 中找到任何明确的示例来说明您何时以及如何处理此调用 我假设它可能是为了测试通知 但看起来它可能只是整
  • 文件 ReadAllLines 将外语变成乱码 (�)

    我正在创建一个工具来替换文本文件中的某些文本 我的问题是 File ReadAllLines 将希伯来字符变成乱码 奇怪的问号 有谁知道为什么会发生这种情况 请注意 我在游戏等中确实遇到希伯来语问题 在记事本中 我无法保存希伯来语文档 我可
  • 使用文件名将文件一个文件夹复制到 Google 云端硬盘中的另一个文件夹

    我的谷歌云端硬盘帐户中有两个文件夹 文件夹 1 和 文件夹 2 文件夹1 内有多个文件 假设有一个文件名Test txt我想复制Test txt使用 Driveapp 将文件保存到 文件夹 2 我找到了代码 但它仅适用于 文件唯一 ID 我
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 从服务定期更新 AppWidget

    这就是我想要从我的 AppWidget 中得到的 当小部件添加到屏幕时 配置活动就会出现 到目前为止还不错 保存配置后 将启动一个更新小部件的服务 到目前为止一切顺利 定期安排警报以运行更新小部件的服务 这里遇到麻烦了 这已经严重让我的头发
  • 崩溃的 Visual Studio Live 单元测试

    我是新用户堆栈溢出这是我的问题 作为我工作的一部分 我们最近安装了 VS 2017 企业版 一切都很好 直到几周前实时单元测试模块停止工作 有谁能够解决此类问题吗 这是输出控制台 17 26 23 170 Info Live Unit Te
  • 为什么我可以在 Ruby 中使用 Object#send 访问私有/受保护的方法?

    班上 class A private def foo puts foo end public def bar puts bar end private def zim puts zim end protected def dib puts
  • Django:生成 CSV 文件并将其存储到 FileField 中

    在我的 Django 视图文件中 我需要从元组列表生成 CSV 文件 并将 CSV 文件存储到模型的 FileField 中 class Bill models Model billId models IntegerField bill m
  • 如何在IntelliJ中快速输入记录器定义?

    是否有一些实时模板或其他东西可以将记录器定义添加到类中 在 Eclipse 中我有一个模板 private static final Logger log LoggerFactory getLogger enclosing type cla
  • 将元素追加到 Angular QueryList

    有没有办法将新元素追加到 QueryList 中 例如 我有一个像这样的查询列表 ContentChildren SysColumn syscolumns QueryList
  • Ruby 枚举器链接

    在这个例子中 1 2 3 each with index map i j i j gt 0 2 6 我的理解是 既然each with index枚举器链接到map map表现得像each with index通过在块内传递索引 并返回一个