Help us understand the problem. What is going on with this article?

Ruby 文字列をハッシュに変換

More than 3 years have passed since last update.

"x: 100, y: 200, z: 300" のような文字列を
{x: 100, y: 200, z: 300 }のようなハッシュ{sym: int}に変換する方法
ruby2.2で探してみたところ、それ用のメソッドが無いようなので書いてみた。

補足

2.1以降 Array#to_h
それ以前 Hash[ ]

パターン1 一旦配列にする

文字列を":"と","区切りで二次元配列にして、それを二個ずつ取り出してハッシュに変換する。

def to_hash(str)
  array = str.delete(' ').split(/[:,]/)
  array.each_slice(2).map {|k, v| [k.to_sym, v.to_i] }.to_h 
end

パターン2 eval使う(要注意)

超簡単、ruby怖い。

def to_hash(str)
  eval("{#{str}}")
end

パターン3 scanで正規表現を使う (追記)

@jnchitoさんより。

def to_hash(str)
  str.scan(/(\w+):\s+(\d+)/).map{|k, v| [k.to_sym, v.to_i] }.to_h
end

速度比較

上記の2つをそれぞれ1000回実行した平均(小数点2桁目以降は誤差みたいなものなので省略)
※パターン3を追記

  • "x: 100, y: 200, z: 300"
パターン1  4.2e-06
パターン2  4.8e-06
パターン3  3.6e-06
  • "x: 100, y: 200, z: 300, a: 1000, b: 20"
パターン1  5.7e-06
パターン2  5.7e-06
パターン3  4.8e-06
  • "x: 100, y: 200, z: 300, a: 1000, b: 20, c: 800"
パターン1  6.4e-06
パターン2  6.3e-06
パターン3  5.6e-06

追記したパターン3が最も速い結果になった。
要素が増えるにつれパターン3と他との差が開いていく。

もっと良い方法があったりしたらおねがいします!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away