- 更新日: 2014年3月25日
- Ruby
Ruby でハッシュの値が nil の場合のみ値を変更して新たなハッシュを返す
スポンサーリンク
Ruby のハッシュで、値が nil の要素の値を文字列 “not exist” に変更して、新たなハッシュを返したい時のような処理を行う方法です。
【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
スポンサーリンク
以下のハッシュで例示。
1 |
{foo: "foo", bar: "bar", baz: nil, hoge: "hoge", fuga: nil} |
Hash#map を使う
普通に考えると、Hash#map を使いたくなるのですけど、Hash#map ではハッシュを返せません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
pry(main)> hash = {foo: "foo", bar: "bar", baz: nil, hoge: "hoge", fuga: nil} => {:foo=>"foo", :bar=>"bar", :baz=>nil, :hoge=>"hoge", :fuga=>nil} pry(main)> hash.map{|k, v| v = "not exist" if v.nil?} => [nil, nil, "not exist", nil, "not exist"] pry(main)> hash.map{|k, v| v = "not exist" if v.nil?; v} => ["foo", "bar", "not exist", "hoge", "not exist"] pry(main)> hash.map{|k, v| v = "not exist" if v.nil?; [k, v]} => [[:foo, "foo"], [:bar, "bar"], [:baz, "not exist"], [:hoge, "hoge"], [:fuga, "not exist"]] |
最後のやつはなかなか惜しい。
1 2 3 4 5 6 7 8 |
pry(main)> Hash[hash.map{|k, v| v = "not exist" if v.nil?; [k, v]}] => {:foo=>"foo", :bar=>"bar", :baz=>"not exist", :hoge=>"hoge", :fuga=>"not exist"} |
こうしてやると、ハッシュにできます。
Hash#inject を使う
1 2 3 4 5 6 7 8 9 10 |
pry(main)> hash = {foo: "foo", bar: "bar", baz: nil, hoge: "hoge", fuga: nil} => {:foo=>"foo", :bar=>"bar", :baz=>nil, :hoge=>"hoge", :fuga=>nil} pry(main)> hash.inject({}){|h, (k, v)| v = "not exist" if v.nil?; h[k]=v; h} => {:foo=>"foo", :bar=>"bar", :baz=>"not exist", :hoge=>"hoge", :fuga=>"not exist"} |
完璧。Ruby の inject メソッドはかっこいい。Ruby 入門したばかりの頃は理解できにくかったメソッドの一つなのですけど。他にも良い方法がありそうな気がするので、ご存知でしたらぜひ教えて下さい!
- – 参考リンク –
- Ruby – Hash#map は Hash を返さない – Qiita
スポンサーリンク
私は以下の本で Ruby を覚えました。メタプログラミングRubyは入門を超える内容で難しめです。
>> 次の記事 : Ruby で nil.to_i は 0 を返す
<< 前の記事 : Ruby のハッシュで値が nil の要素を削除して新しいハッシュを返す
- Ruby の関連記事
- Gemの作り方(Ruby Gem)
- ローカル開発中のgemをGemfileに書いてインストール
- 熊本地震の余震が夜に多いのは本当か?Rubyプログラムで検証してみた
- El Capitanでgemのnative extensionビルド失敗に対応
- Rubyで親クラスから子クラスの定数を参照
- MacabをRubyで使う
- rbenv/ruby-buildでRuby最新バージョンをインストール
- Rubyでクラスインスタンス変数にインスタンスメソッドからアクセス
- 距離1kmあたりの緯度・経度の度数を計算(日本・北緯35度)
- Google Maps Geocoding APIで住所から緯度・経度を取得するRubyコード
Leave Your Message!