Я не верю, что использование регулярного выражения - лучший способ создать хеш.Вместо этого я предлагаю использовать методы String # split , Hash :: [] , Hash # transform_values и String # to_i .Если s
- строка, указанная в примере,
Hash[*s.split].transform_values(&:to_i)
#=> {"10c"=>10, "bj"=>18, "2s"=>15, "3s"=>3, "8d"=>8,
# "as" =>14, "kh"=>13, "8c"=> 8, "3c"=>3, "6d"=>6,
# "kc" =>13, "5d"=> 5, "ad"=>14}
Шаги следующие:
a = s.split
#=> ["10c", "10", "bj", ... , "14"]
b = Hash[*a]
#=> {"10c"=>"10", "bj"=>"18", "2s"=>"15", "3s"=>"3",
# "8d" => "8", "as"=>"14", "kh"=>"13", "8c"=>"8",
# "3c" => "3", "6d"=> "6", "kc"=>"13", "5d"=>"5",
# "ad" =>"14"}
b.transform_values(&:to_i)
#=> {"10c"=>10, "bj"=>18, "2s"=>15, "3s"=>3, "8d"=>8,
# "as" =>14, "kh"=>13, "8c"=> 8, "3c"=>3, "6d"=>6,
# "kc" =>13, "5d"=> 5, "ad"=>14}
Оператор splat (*
), заставляет Hash[*a]
быть оцененным как Hash["10c", "10", "bj", ... , "14"]
.
b.transform_values(&:to_i)
здесь эквивалентно b.transform_values { |v| v.to_i }
.