2016-06-18 108 views
3

我刚开始学习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类,然后将我的字符串“扔”到这个类的一个实例?

回答

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" 
+0

感谢您的帮助,并向我展示Struct和zip - 我将阅读有关这些元素以充分了解它们。 – Maciek

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"为数字。