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#[] 和正则表达式/.+(?=,)/。 (?=,) 是一个正向预测,它要求匹配项后面紧跟一个逗号。因为默认情况下匹配是 greedy,所以前瞻匹配 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 的其余两个值被传递给块并执行类似的计算。