【问题标题】:to_enum(:scan) vs scan alone with regular expression in rubyto_enum(:scan) 与 ruby​​ 中的正则表达式单独扫描
【发布时间】:2017-07-07 12:50:52
【问题描述】:

我不明白为什么我们使用 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 来使字符串可枚举,而我们可以使用 scan 来返回一个数组?

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

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

这里有一些我遗漏和不理解的东西......谁能解释一下吗?

谢谢

【问题讨论】:

    标签: ruby regex match enumerable


    【解决方案1】:

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

    【讨论】:

    • 好的,但我仍然不明白为什么当我们直接在字符串变量上调用 scan 时,我们在数组中得到相同的值,而不是使用 to_enum 的结果,!!!
    • 我不认为这是人为的,我目前在研究如何将匹配的数据转换为哈希时遇到了这个问题,并且不得不使用 to_enum(:scan) 如下content.to_enum(:scan, DDD_MARKUP).map { Regexp.last_match.named_captures }跨度>
    猜你喜欢
    • 2012-01-06
    • 2021-05-20
    • 2013-04-10
    • 2016-01-23
    • 2011-08-06
    • 2011-12-07
    • 1970-01-01
    • 2017-02-18
    • 2015-06-26
    相关资源
    最近更新 更多