什么是Enumerator对象? (使用String#gsub创建)

时间:2011-12-13 06:52:57

标签: ruby enumerator

我有一个属性数组,如下所示,

attributes = ["test, 2011", "photo", "198.1 x 198.1 cm", "Photo: Manu PK Full Screen"]

当我这样做时,

artist = attributes[-1].gsub("Photo:")
p artist

我在终端

中获得以下输出
#<Enumerator: "Photo: Manu PK Full Screen":gsub("Photo:")>

想知道为什么我将枚举器对象作为输出?提前谢谢。

编辑: 请注意,而不是attributes[-1].gsub("Photo:", ""), I am doing attributes[-1].gsub("Photo:")所以想知道为什么枚举器对象在这里返回(我期待一条错误消息)以及发生了什么。?

Ruby - 1.9.2

Rails - 3.0.7

2 个答案:

答案 0 :(得分:16)

Enumerator对象提供了枚举常用的一些方法 - nexteacheach_with_indexrewind等。

您在此处获得Enumerator对象,因为gsub非常灵活:

gsub(pattern, replacement) → new_str
gsub(pattern, hash) → new_str
gsub(pattern) {|match| block } → new_str
gsub(pattern) → enumerator 

在前三种情况下,替换可以立即发生,并返回一个新字符串。但是,如果您没有提供替换字符串,替换哈希或替换块,则会返回Enumerator对象,该对象允许您访问匹配的字符串片段以便稍后使用:

irb(main):022:0> s="one two three four one"
=> "one two three four one"
irb(main):023:0> enum = s.gsub("one")
=> #<Enumerable::Enumerator:0x7f39a4754ab0>
irb(main):024:0> enum.each_with_index {|e, i| puts "#{i}: #{e}"}
0: one
1: one
=> " two three four "
irb(main):025:0> 

答案 1 :(得分:5)

当既没有提供块也没有提供第二个参数时,gsub返回一个枚举器。查看here了解更多信息。

要删除它,您需要第二个参数。

attributes[-1].gsub("Photo:", "")

或者

attributes[-1].delete("Photo:")

希望这会有所帮助!!