为什么 chunk_while 返回 Enumerator 对象

2024-03-12

为什么chunk_while返回一个实例Enumerator?

这段代码:

array = [0, 1, 2, 3, 4, 5, 7, 8, 9, 15, 16]
p array.chunk_while {|i,j| i + 1 == j }

输出这个:

#<Enumerator::Generator:0x00000002bef0a8>:each>

我有红宝石版本ruby 2.3.1p112 (2016-04-26 revision 54768) [x64-mingw32].


中的方法可枚举 http://ruby-doc.org/core-2.3.0/Enumerable.html模块,例如chunk_while,要求接收者是枚举器,即类的实例枚举器 http://ruby-doc.org/core-2.3.0/Enumerator.html。因此,如果一个Enumerable方法如chunk_while返回一个枚举器,它可以是另一个枚举器的接收者Enumerable方法(并且该方法可以是另一个方法的接收者Enumerable方法等)。这就是所谓的方法链接。这就是为什么你会看到很多Enumerable如果未提供块,方法将返回一个枚举器。

以枚举器作为接收者的方法的链接还可能包括其他模块或类中的方法Enumerator, 例如枚举器#with_index http://ruby-doc.org/core-2.3.0/Enumerator.html#method-i-with_index.

这就是为什么我们可以编写如下表达式。

array.chunk_while {|i,j| i + 1 == j }.map.with_index { |a,i| i.even? ? a.reduce(:+) : 0 }
  #=> [15, 0, 31]

让我们来分解一下。

e0 = array.chunk_while {|i,j| i + 1 == j }
  #=> #<Enumerator: #<Enumerator::Generator:0x007fa01b9639e0>:each> 
e1 = e0.map
  #=> #<Enumerator: #<Enumerator: #<Enumerator::Generator:0x007fa01b9639e0>:each>:map> 
e2 = e1.with_index
  #=> #<Enumerator: #<Enumerator: #<Enumerator:
  #    #<Enumerator::Generator:0x007fa01b9639e0>:each>:map>:with_index> 
e2.each { |a,i| i.even? ? a.reduce(:+) : 0 }
  #=> [15, 0, 31] 

检查产生的操作的返回值e0, e1 and e2. e1 and e2可能被认为是复合枚举器.

作为实践问题,chunk_while几乎总是链接到另一个方法,因此它返回一个枚举器是有意义的。

您可能会问,“为什么所有可枚举方法都必须需要一个作为枚举器的接收器,考虑到chunk_while示例中的接收器,array,不是一个枚举器”?答案在于,每个包含Enumerable模块必须有一个方法each返回一个枚举器。因此可以写

array.each.chunk_while {|i,j| i + 1 == j }.to_a

但 Ruby 可以帮你省去麻烦。 Ruby 将调用数组#each https://stackoverflow.com/questions/40066614/convert-array-of-hashes-to-array/40066893?noredirect=1#comment67536024_40066893当它发现在数组上调用的方法需要一个枚举器作为其接收者时,为您提供帮助。所有具有方法的类都是如此each.

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

为什么 chunk_while 返回 Enumerator 对象 的相关文章

  • 使用 Ruby 的“open-uri”打开 utf-8 URI 时遇到问题

    我正在尝试使用 ruby 和 open uri 从谷歌地图网络服务 API 获取丹麦位置地址 试图得到丹麦艾勒 http maps googleapis com maps api geocode json address r sensor
  • 用一种方法进行 Ruby 选择和拒绝

    是否有任何内置方法可以结合以下功能Enumerable select 找到该块等于 true 的所有内容 和Enumerable reject 找到该块中所有等于 false 的内容 就像是 good bad list magic meth
  • rake cucumber 和 rake spec 始终使用“开发”环境

    我运行 Cucumber 和 RSpec 测试的 rake 任务始终使用我的development环境 以下是相关的配置文件 RAILS ROOT config environments cucumber rb Edit at your o
  • 比较 ruby​​ 中的两个字符串[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我刚刚开始学习 ruby 这可能很容
  • 如何将枚举作为字符串存储到rails中的数据库中

    如何在 ruby 中创建迁移 其中默认值是字符串而不是整数 我想将枚举存储到数据库中 但我不想将其存储为整数 因为这样对于另一个应用程序来说没有意义想要使用同一张桌子 我该怎么做default female 代替default 0 clas
  • 以 Rails 形式处理 MongoMapper EmbeddedDocument

    首先 我对一般编程和 Rails 都是新手 我选择 Rails 是因为它看起来是一种很容易上手的语言 对于我的项目 我将 MongoMapper 与 Rails 结合使用 我正在尝试以与文档相同的形式处理嵌入文档 我有以下模型 class
  • Ruby:创建日期范围

    我正在寻找一种优雅的方式来制作一系列日期时间 例如 def DateRange start time end time period end gt gt results DateRange DateTime new 2013 10 10 1
  • 从哈希中删除 nil 值

    我希望从哈希中删除具有nil value article是一个存储每篇文章的类 并且attributes方法将文章存储为散列 预期结果 articles results author null title Former bar manage
  • Ruby 2 升级破坏了 Nokogiri 和/或 open-uri 编码?

    将 Rails3 2 Ruby 1 9 应用程序升级到 Rails3 2 Ruby 2 1 2 时 我有一个谜团需要解决 Nokogiri 似乎崩溃了 因为它使用 open uri 改变了它的行为 没有改变 gem 版本 只是改变 ruby
  • Rspec:期望与期望与块 - 有什么区别?

    刚刚学习 rspec 语法 我注意到这段代码有效 context given a bad list of players do let bad players it fails to create given a bad player li
  • 使 case/switch 返回值的快捷方式

    我很确定我看到有人做了像下面的代码这样的快捷技术 这不起作用 return case guess when guess gt answer then high when guess lt answer then low else corre
  • 在 Ruby 控制台应用程序中获取键盘事件(无需按“Enter”输入)的最佳方法是什么?

    我在互联网上寻找这个答案已经有一段时间了 发现其他人也在问同样的事情 即使在这里也是如此 因此 这篇文章将介绍我的案例以及对我找到的 解决方案 的回应 我对 Ruby 很陌生 但出于学习目的 我决定创建一个 gem here https g
  • “(1..4).inject(&:+)”在 Ruby 中如何工作

    我发现 Ruby 中的这段代码非常有趣 1 4 inject 好的 我知道什么inject是的 我知道这段代码基本上相当于 1 4 inject 0 a n a n 但它究竟是如何运作的呢 Why 与写块相同 a n a n 为什么它不需要
  • 将 Rails 更新到特定版本

    如何将 Rails 更新到特定版本 我的本地计算机上有 Rails 3 2 2 但我需要更新到版本 3 2 3 如果我执行gem update rails 将会更新到最新的3 2 6版本 我怎样才能做到这一点 gem install rai
  • mail_form gem 与 sidekiq 工作者

    怎么做邮件表格gem 与 sidekiq 工作人员一起工作吗 https github com plataformatec mail form https github com plataformatec mail form 我可能做错了什
  • Rails current_path 助手?

    我正在开发具有以下路由条件的 Rails 3 2 应用程序 scope locale locale de en do resources categories only index show get newest index as newe
  • 机架测试失败:JSON 请求尚未响应

    我正在尝试为我的 Ruby 项目创建一个 JSON API 如下所示Ticketee https github com rails3book ticketeeYehuda Katz 书中提供的示例Rails 3 实际应用 http www
  • 在 Ruby 中的文件中查找并替换

    我有一个用 ruby 编写的小程序 我在这里找到了一段很好的代码 用于查找和替换文件中的某些内容 但它似乎不起作用 这是代码 usr bin env ruby DOC test txt FIND M SEP n make substitut
  • Rails3 SQL 日志记录输出在单独的文件中

    我希望将所有 ActiveRecord SQL 日志记录重定向到不同的文件中 将其放在控制台或 log development log 中有点混乱 怎么做 我希望将其放在 log development sql log 文件中 Thanks
  • 在 cygwin 和 powershell 中查看不同的 gem 列表

    我用的是gem listpowershell 和 cygwin 中的命令都显示不同的 gem 列表 Cygwin 显示 LOCAL GEMS bundler 1 2 3 json 1 7 5 minitest 2 12 1 rake 0 9

随机推荐