arr = ["John,Doe,11222019", "Mark,King,11232019",
"Angle,Darma,11242019"]
arr.map do |s|
{name: s[/.+(?=,)/].tr(',',' '), number: s[/\d+/].to_i}
end
#=> [{:name=>"John Doe", :number=>11222019},
# {:name=>"Mark King", :number=>11232019},
# {:name=>"Angle Darma", :number=>11242019}]
Шаги следующие. Enumerable # map передает первый элемент arr
в блок, и переменная блока s
устанавливается равной его значению:
s = arr.first
#=> "John,Doe,11222019"
Затем выполняются вычисления блока:
a = s[/.+(?=,)/]
#=> "John,Doe"
При этом используется метод String # [] с регулярным выражением /.+(?=,)/
.(?=,)
- это позитивный прогноз , который требует, чтобы за совпадением сразу следовала запятая.Поскольку совпадения по умолчанию жадные , предпросмотр соответствует последней запятой в s
.
b = a.tr(',',' ')
#=> "John Doe"
При этом используется метод String # tr .В качестве альтернативы можно использовать a.sub(',',' ')
.
c = s[/\d+/]
#=> "11222019"
d = c.to_i
#=> 11222019
Затем блок возвращает:
{ name: c, number: d }
#=> {:name=>"11222019", :number=>11222019}
, то есть объект, на который отображается s
.Оставшиеся два значения arr
передаются в блок и выполняются аналогичные вычисления.