Просто для удовольствия, неразделенный вариант (который также состоит из двух строк):
m = "Henry Fillenger".match(/(?<first_name>\S+)\s+(?<last_name>\S+)/)
name = m.names.each_with_object({ }) { |name, h| h[name.to_sym] = m[name] }
Интересными частями будут именованные группы захвата ((?<first_name>...)
) в регулярном выражении и общая техника хеширования с использованием each_with_object
. Для именованных групп захвата требуется 1,9.
Если бы кто-нибудь осмелился, можно было бы обезьяна вставить патч each_with_object
прямо в MatchData
как, скажем, to_hash
:
class MatchData
def to_hash
names.each_with_object({ }) { |name, h| h[name.to_sym] = self[name] }
end
end
И тогда вы можете получить свою однострочную строку:
name = "Henry Fillenger".match(/(?<first_name>\S+)\s+(?<last_name>\S+)/).to_hash
Я не очень рекомендую это, я только поднимаю это как предмет интереса. Я немного разочарован тем, что MatchData
уже не имеет метода to_h
или to_hash
, он станет разумным дополнением к его to_a
методу.