枚举器改为不同的类

时间:2016-03-30 04:56:18

标签: ruby enumerator

我有一个字符串:

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/)

2 个答案:

答案 0 :(得分:2)

在询问之前,您可能需要查看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 }

答案 1 :(得分:0)

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