2016-06-18 3 views
3

Rubyを学び始めました。Rubyの文字列をハッシュ値

I次の文字列があります。

"Mark Smith, 29" 

をし、私はそれをハッシュに変換したいので、それは次のようになります。カットするために、私は次のコードを書いた

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

入力:

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

今、私は文字列の配列を持っています。これをハッシュに変換するエレガントな方法はありますか?私はこのように3回反復することができます知っている:

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

ありがとう、私に構造とジップを教えていただきありがとうございます。 – 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"を数字とする。

関連する問題