Ruby字符串到哈希值

时间:2016-06-18 15:43:43

标签: ruby hash

我刚开始学习Ruby!

我有以下字符串:

"Mark Smith, 29"

我希望将其转换为哈希值,所以看起来像这样:

{:name=>"Mark", :surname=>"Smith", :age=>29}

我编写了以下代码,以减少输入:

a1 = string.scan(/\w+|\d+/)

现在我有一个字符串数组。是否有一种优雅的方式将其转换为哈希?我知道我可以做三次这样的迭代:

pers = Hash.new
pers[:name] = a1[0]
pers[:surname] = a1[1]
pers[:age] = a1[2]

但也许有一种方法可以使用.each方法或类似的方法来做到这一点?或者也许可以使用预定义的键(:name, :surname, :age)定义类Person,然后将我的字符串“抛出”到此类的实例中?

2 个答案:

答案 0 :(得分:9)

是的,你可以这样做,

%i(name surname age)
   .zip(string.scan(/\w+|\d+/))
   .to_h
# => {:name=>"Mark", :surname=>"Smith", :age=>"29"}

或者,您可以享受Struct的好处,例如:

Person = Struct.new(:name, :surname, :age )
person = Person.new( *string.scan(/\w+|\d+/) )
person.age  # => "29"
person.name # => "Mark"

答案 1 :(得分:2)

为了简单,精确和清晰,我会这样做:

"Mark Smith, 29" =~ /(\w+)\s+(\w+),\s+(\d+)/
  #=> 0 
{ :name=> $1, :surname=> $2, :age=> $3.to_i }
  #=> {:name=>"Mark", :surname=>"Smith", :age=>29} 

/\w+|\d+/不同,此正则表达式要求"Mark""Smith"为字符串,"29"为数字。