to_enum(:scan)vs单独扫描,在ruby中使用正则表达式

时间:2017-02-17 21:03:37

标签: ruby regex match enumerable

我不明白为什么当scan方法本身返回一个匹配数组时,为什么我们使用to_enum来使字符串可枚举,在这种情况下to_enum做了什么?

这是带有to_enum的代码:

string = "The quick 12 brown foxes jumped over the 10 lazy dogs"

p string.to_enum(:scan, /\d+/).map {Regexp.last_match }

返回:

=> [#<MatchData "12">, #<MatchData "10">]

那么为什么我们在这里使用to_enum来使字符串在我们可以使用将返回数组的扫描时可枚举?

我也试过单独使用扫描,但得到了奇怪的结果:

p string.scan(/\d+/).map { Regexp.last_match}
=>[#<MatchData "10">, #<MatchData "10">]

我遗漏了一些东西而且在这里不理解......有人可以解释一下吗?

感谢

1 个答案:

答案 0 :(得分:1)

to_enum不会使字符串可枚举,它实际上使String#scan成为一个懒惰的枚举器。 enum_forto_enum的别名,可能有助于在此处澄清一些内容。 map将每次扫描结果(懒惰地)产生到块中,该块使用last_match Regexp类方法返回最后一次最近的匹配。这是一个非常人为的例子,你不可能在野外看到它。