Rails

【Learning Diary8】要素がHashのときの値の取り出し方のおさらい

【Learning Diary8】要素がHashのときの値の取り出し方のおさらい

 

ネストされた値の取り出し方に迷うことがあるので、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>'

 

-Rails
-, ,