我有一个字符串:
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/)
答案 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发送到z
。 Enumerator#each
获得enum_for
的接收者(bottom_line
)的等级,即String
。然后它会调用方法String#each
。它在String
类中找不到这样的实例方法,因此它会引发您获得的异常。