2017-02-17 7 views
0

Я не понимаю, почему мы используем to_enum, чтобы перечислить строку, когда метод сканирования вернет массив совпадений, что делать в этом случае to_enum?to_enum (: scan) vs scan только с регулярным выражением в ruby ​​

это код с 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

to_enum не делают строку перечислима, это на самом деле делает String#scan ленивый перечислитель. enum_for является псевдонимом to_enum, и это, возможно, помогло прояснить ситуацию здесь несколько. map дает каждый результат сканирования - один за раз (лениво) - к блоку, который использует метод класса last_match Regexp для возврата последнего последнего совпадения. Это действительно надуманный пример, который вы вряд ли увидите в дикой природе.

+0

ОК, но я до сих пор не понимаю, почему, когда мы вызываем сканирование непосредственно на строковой переменной, мы получаем одно и то же значение в массиве и не такие же результаты, как при использовании to_enum, !!! –