array = [["a: 1", "b:2"], ["a: 3", "b:4"]]
array.map do |a|
Hash[
*a.flat_map { |s| s.split(/: */) }.
map { |s| s.match?(/\A\d+\z/) ? s : s.to_sym }
]
end
#=> [{:a=>"1", :b=>"2"}, {:a=>"3", :b=>"4"}]
Регулярное выражение /: */
гласит: «соответствует двоеточие, за которым следует ноль или более (*
) пробелов». /\A\d+\z/
читает, "соответствует началу строки (\A
), за которым следуют одна или несколько (+
) цифр (\d
), за которыми следует конец строки (\z
).
Шаги следующие: во-первых, элемент arr[0]
должен быть передан в блок, переменной блока a
присвоено его значение и выполнен расчет блока.
a = array[0]
#=> ["a: 1", "b:2"]
b = a.flat_map { |s| s.split(/: */) }
#=> ["a", "1", "b", "2"]
c = b.map { |s| s.match?(/\A\d+\z/) ? s : s.to_sym }
#=> [:a, "1", :b, "2"]
d = Hash[*c]
#=> {:a=>"1", :b=>"2"}
We см. массив ["a: 1", "b:2"]
, сопоставленный с {:a=>"1", :b=>"2"}
. Затем элементу arr[1]
передается в блок, переменной блока a
присваивается его значение и выполняется вычисление блока.
a = array[1]
#=> ["a: 3", "b:4"]
b = a.flat_map { |s| s.split(/: */) }
#=> ["a", "3", "b", "4"]
c = b.map { |s| s.match?(/\d/) ? s : s.to_sym }
#=> [:a, "3", :b, "4"]
d = Hash[*c]
#=> {:a=>"3", :b=>"4"}
Оператор splat (*
) заставляет Hash[*c]
быть оценен как:
Hash[:a, "3", :b, "4"]
См. Ха sh :: [] .