2016-11-27 17 views
1

ネストされたハッシュを使用していて、何か助けを得ることに問題があります。私が扱っているデータは次のようになります:Ruby - ハッシュキーが存在することを確認してください。

=> {"searchresults"=> 
    {"request"=>{"address"=>"10 Tiverton Ln", "citystatezip"=>"28803"}, 
    "message"=>{"text"=>"Request successfully processed", "code"=>"0"}, 
    "response"=> 
    {"results"=> 
     {"result"=> 
     {"zpid"=>"5620805"}} 

私はハッシュから特定の情報を取得しようとしています。私が持っている問題は:ハッシュキーが存在しない場合、それはエラーをスローし、スクリプトを殺す。

この問題を再調整するには、事前にキーの存在を確認しているだけであることがわかりましたが、チェックが正しく機能していないようです。私は "キーを使用していますか?"私の検証では(キーがあると)、Rubyから "false"という結果が返ってくるので、私は明らかに何か間違っています。

hash["searchresults"]["response"]["results"]["result"]["zpid"] 
=> "5620805" 
hash.key?("searchresults""response""results""result""zpid") 
=> false 

(注:私は、最後の入力は、コメントに基づいて、単に連結した文字列だったが、動作するように任意の組み合わせを取得することはできません実現し、下記の方にご覧ください記事の下部)

は最高何ですか存在しないハッシュキーをクエリするときにエラーを回避する方法はありますか? 「キー?メソッドは、それについて行くための適切な方法です、誰かが私のエラーがどこの正しい方向に私を指すことができます。


応答に基づいて情報を追加しました。私はあなたに感謝...私は最終的に私が必要とcomments.Everythingのおかげで作業している掘るメソッドの構文を理解することができたルビー

ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux] 

の以下のバージョンを使用しています!

hash.dig("searchresults", "response", "results", "result", "zpid") 
    => "5620805" 
+0

あなたはどのバージョンのRubyを使用していますか?最近のものには、あなたに役立つかもしれない['Hash#dig'](http://ruby-doc.org/core-2.3.3/Hash.html#method-i-dig)があります。 –

+0

有効なRubyオブジェクトではないため、ソリューションをテストするためにサンプルを使用することはできません。ここではハッシュの一部を与えましたが、有効なハッシュにするのは非常に簡単です。また、例を挙げるときは、目的の出力を表示し、各入力オブジェクトに変数を割り当ててください(例えば 'h = {" searchresults "=> ...>))。後者は、読者が答えやコメントをそれらを定義することなくそれらの変数(ここでは 'h')を参照できるようにします。また、 'pry(main)>'を編集してください。気が散っているだけでなく、コードをカットアンドペーストするすべての読者は、そうでない場合は削除する必要があります。 –

答えて

2
h = { "searchresults"=> 
     { "request" =>{ "address"=>"10 Tiverton Ln", "citystatezip"=>"28803" }, 
      "message" =>{ "text"=>"Request successfully processed", "code"=>"0" }, 
      "response"=>{ "results"=>{ 
            "result"=>{ "zpid"=>"5620805" } 
            } 
         } 
     } 
    } 

@muistooshortコメントで指摘したように、あなたがRubyのV2.3の+を使用している場合は、Hash#digは、ここで使用することができます。

h.dig("searchresults") 
    #=> {"request"=>{"address"=>"10 Tiverton Ln", "citystatezip"=>"28803"}, 
    # "message"=>{"text"=>"Request successfully processed", "code"=>"0"}, 
    # "response"=>{"results"=>{"result"=>{"zpid"=>"5620805"}}}} 
h.dig("searchresults", "response") 
    #=> {"results"=>{"result"=>{"zpid"=>"5620805"}}} 
h.dig("searchresults", "response", "results") 
    #=> {"result"=>{"zpid"=>"5620805"}} 
h.dig("searchresults", "response", "results", "result") 
    #=> {"zpid"=>"5620805"} 
h.dig("searchresults", "response", "results", "result", "zpid") 
    #=> "5620805" 

h.dig("searchresults", "cat", "results") 
    #=> nil 
h.dig("searchresults", "response", "results", "result", "dog") 
    #=> nil 

ルビーの以前のバージョンのためには、Enumerable#reduce(別名inject)を使用することができます。

def my_dig(h, *keys) 
    keys.reduce(h) { |g,k| g && g[k] } 
end 

my_dig(h, "searchresults") 
    #=> {"request"=>{"address"=>"10 Tiverton Ln", "citystatezip"=>"28803"}, 
    # "message"=>{"text"=>"Request successfully processed", "code"=>"0"}, 
    # "response"=>{"results"=>{"result"=>{"zpid"=>"5620805"}}}} 
my_dig(h, "searchresults", "response") 
    #=> {"results"=>{"result"=>{"zpid"=>"5620805"}}} 
my_dig(h, "searchresults", "response", "results") 
    #=> {"result"=>{"zpid"=>"5620805"}} 
my_dig(h, "searchresults", "response", "results", "result") 
    #=> {"zpid"=>"5620805"} 
my_dig(h, "searchresults", "response", "results", "result", "zpid") 
    #=> "5620805" 

my_dig(h, "searchresults", "cat", "results") 
    #=> nil 
my_dig(h, "searchresults", "response", "results", "result", "zpid", "dog") 
    #=> nil 
+0

お返事ありがとうございました。元の投稿に詳細を追加して、うまくクリアしました。上記の情報を使用して、私はまだエラーが発生しているようです。 => "5620805" pry(main)> hash.key?(hash.dig()); "検索結果"、 "レスポンス"、 "結果"、 "結果"、 "zpid")) => false – pjw23

+0

'h = {:a => {:c => {:d => 1}、:b => 2}} 'であり、値はh [:a] [:b] [:d]'になります。ここでh [:a] [:b] [:d]#=> NoMethodError: 'h [:a] [:b]#=> nil'のため' nil:NilClass'のための未定義メソッド '[] nil [:d] 'は例外を発生させます)。しかし、3つのキー、 ':a'、':b'、 ':d'はハッシュの中にあります。明らかに、個々のキーが存在するかどうかだけでは判断できません。私の答えは、すべてのキーが正しい順序で存在する場合には望みの結果を返し、そうでなければ 'nil'を返します。あなたは何をしたいのですか?すべてのキーが正しい順序で表示されているかどうかを確認するのは同じくらいの作業です。 –

関連する問題