【问题标题】:Enumerator changing to different class枚举器更改为不同的类
【发布时间】:2016-03-30 04:56:17
【问题描述】:

我有一个字符串:

bottom_line = "some text"

当我使用enum_for 从它创建一个枚举器,并尝试在其上调用each 时,我收到一个错误:

z = bottom_line.enum_for
z.each {|item| item.scan(/some_regex/)}
# => undefined method `each' for #<String:0x00000001f65350>

这是怎么回事?

当我将enum_for 与该方法全部链接在一行时,它可以工作:

z = bottom_line.enum_for(:scan, /some_regex/)

【问题讨论】:

  • 感谢 Cary 的清晰解释 - 我之前曾尝试查看文档,但查看了 Enumerator 文档,但我没有意识到它将 #each 方法传递给底层的类对象,在这种情况下为字符串

标签: ruby enumerator


【解决方案1】:

在询问之前,您可能需要查看Object#enum_for 上的文档。

Object#enum_for 接受 1+ 个参数:实际调用枚举时要调用的方法(默认为 :each)以及要传递给该方法的 splatted 参数。

也就是说,

z = bottom_line.enum_for

绝对等价于:

z = bottom_line.enum_for(:each)

而内联版本是

z = bottom_line.enum_for(:scan)

为什么你会期望他们的行为方式相同?要实现相同的功能,可以在调用 enum_for 时显式指定方法:

z = bottom_line.enum_for :scan
z.each(/some_regexp/) { |item| puts item }

【讨论】:

  • 赞成 在询问之前查看文档 注意
【解决方案2】:

z.each 导致方法Enumerator#each 被发送到zEnumerator#each获取enum_for的接收者(bottom_line)的类,即String。然后它会调用方法String#each。它在String 类中没有找到这样的实例方法,因此引发了您获得的异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多