概要
ハッシュから値を取り出す方法で有名な【dig】と【fetch】に来ていただきました。
どういう時にどっちを使えば良いかわからなかったので、違いをまとめました。
対象
- dig と fetch をあまり使ったことが無い方
- dig と fetch の特徴を知りたい方
- 使い分けや挙動を知りたい方
dig
dig は存在感のあるメソッドです。
階層化データからデータを掘り出していることを明示的にしてくれるので
コードの中に dig があるだけで、周辺でやっていることが透けて見えます。
ハッシュからdigでデータを取り出す
とある amazon の summary データに来ていただきました。
def guri_to_dig
summary =
{"marketplaceId"=>"*****",
"adultProduct"=>false,
"autographed"=>false,
"browseClassification"=>{"displayName"=>"*****", "classificationId"=>"gurararara"},
"memorabilia"=>false,
"packageQuantity"=>1,
"releaseDate"=>"2030-01-01",
"tradeInEligible"=>false,
"websiteDisplayGroup"=>"health_and_beauty_display_on_website",
"websiteDisplayGroupName"=>"Health and Beauty"
}
end
# "browseClassification" の"classificationId" value "gurararara" を取り出したい
summary.dig('browseClassification', 'classificationId')
=> "gurararara"
# 架空のkeyを指定すると nil が返ります。
summary.dig('fairy_tail')
=> nil
dig まとめ
dig は階層データを深掘りしていくのに適しています。
Errorが返されるわけではないことを認識した上で、dig を使う必要があります。
fetch
fetch も存在感のあるメソッドです。
key を指定するため、階層が1段階のものに使われる傾向が高いと思います。
ネストしているデータ取得も出来ますが、dig のほうがわかりやすく書けます。多分。
ハッシュからfetchでデータを取り出す
def gura_to_fetch
summary =
{"marketplaceId"=>"*****",
"adultProduct"=>false,
"autographed"=>false,
"browseClassification"=>"guririririri",
"memorabilia"=>false,
"packageQuantity"=>1,
"releaseDate"=>"2030-01-01",
"tradeInEligible"=>false,
"websiteDisplayGroup"=>"health_and_beauty_display_on_website",
"websiteDisplayGroupName"=>"Health and Beauty"
}
end
# "browseClassification" の value "guririririri" を取り出したい
summary.fetch('browseClassification')
=> "guririririri"
# 架空のkeyを指定すると error が返ります。
summary.fetch('fairy_tail')
=> <KeyError: keynotfound: "fairy_tail">
# 架空のkeyを指定すると error が返りますが、第2引数に返したいデフォルト値を入れることが出来ます。
summary.fetch('fairy_tail', nil)
=> nil
fetch まとめ
fetch は key がないとErrorになるので、Error処理が必要になります。
第2引数に返したいデフォルト値を入れることが出来ることが良いとこですね。
一言
架空のkeyを指定しまうと dig は nil
に、 fetch は KeyError
になる。気をつけなはれや〜。