ネストされた値の取り出し方に迷うことがあるので、irbで遊んでみました。
3種類の変数を用意します。
>> foods => {:key1=>"potato", :key2=>"hamburger"} >> drinks => {:key1=>"coffee", :key2=>"tea"} >> fruits => {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
作成した3つの変数を、まとめて変数arryに追加します。
>> arry << foods << drinks << fruits => [{:key1=>"potato", :key2=>"hamburger"}, {:key1=>"coffee", :key2=>"tea"}, {:key1=>"apple", :key2=>"orange", :key3=>"grape"}]
それぞれ、インデックスを指定すると要素の値を取り出せます。
>> arry[0] => {:key1=>"potato", :key2=>"hamburger"} >> arry[1] => {:key1=>"coffee", :key2=>"tea"} >> arry[2] => {:key1=>"apple", :key2=>"orange", :key3=>"grape"} # 存在しないインデックスを指定するとnilが返される >> arry[3] => nil
では、"orange"のみ取り出したいときを考えます。
要素数を指定し、更にキーを指定します。
>> arry[2] => {:key1=>"apple", :key2=>"orange", :key3=>"grape"} >> arry[2][:key2] => "orange"
キーを適切に指定しないと取り出せません。
>> arry[2][key2] (irb):66:in `<main>': undefined local variable or method `key2' for main:Object (NameError) from /Users/xxxxxxxx/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.8.1/exe/irb:9:in `<top (required)>' from /Users/xxxxxxxx/.rbenv/versions/3.2.2/bin/irb:25:in `load' from /Users/xxxxxxxx/.rbenv/versions/3.2.2/bin/irb:25:in `<main>' >> arry[2]["orange"] => nil
続いてhashの場合です。
>> hash => {"foods"=>{:key1=>"potato", :key2=>"hamburger"}, "drinks"=>{:key1=>"coffee", :key2=>"tea"}, "fruits"=>{:key1=>"apple", :key2=>"orange", :key3=>"grape"}}
キーを指定すると値を取得できます。
>> hash["foods"] => {:key1=>"potato", :key2=>"hamburger"} >> hash["drinks"] => {:key1=>"coffee", :key2=>"tea"} >> hash["fruits"] => {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
"orange"を取得したい場合は、2つのキーを指定すれば良いです。
>> hash["fruits"] => {:key1=>"apple", :key2=>"orange", :key3=>"grape"} >> hash["fruits"][:key2] => "orange"
こちらも配列と同様、 ""
や :
も正確に指定する必要はあります。
適切でない場合はnilやエラーが返ります。
>> hash["fruits"]["key2"] => nil >> hash["fruits"][key2] (irb):83:in `<main>': undefined local variable or method `key2' for main:Object (NameError) from /Users/xxxxxxxx/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.8.1/exe/irb:9:in `<top (required)>' from /Users/xxxxxxxx/.rbenv/versions/3.2.2/bin/irb:25:in `load' from /Users/xxxxxxxx/.rbenv/versions/3.2.2/bin/irb:25:in `<main>'