0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ぐりとぐらぐらい似てる dig と fetch の違いを解説

Posted at

概要

ハッシュから値を取り出す方法で有名な【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になる。気をつけなはれや〜。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?