Rails

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

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

 

ネストされた値の取り出し方に迷うことがあるので、irbで遊んでみました。

 

3種類の変数を用意します。

 

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
>> foods
=> {:key1=>"potato", :key2=>"hamburger"}
>> drinks
=> {:key1=>"coffee", :key2=>"tea"}
>> fruits
=> {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
>> foods => {:key1=>"potato", :key2=>"hamburger"} >> drinks => {:key1=>"coffee", :key2=>"tea"} >> fruits => {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
>> foods
=> {:key1=>"potato", :key2=>"hamburger"}
>> drinks
=> {:key1=>"coffee", :key2=>"tea"}
>> fruits
=> {:key1=>"apple", :key2=>"orange", :key3=>"grape"}

 

作成した3つの変数を、まとめて変数arryに追加します。

 

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
>> arry << foods << drinks << fruits
=> [{:key1=>"potato", :key2=>"hamburger"}, {:key1=>"coffee", :key2=>"tea"}, {:key1=>"apple", :key2=>"orange", :key3=>"grape"}]
>> arry << foods << drinks << fruits => [{:key1=>"potato", :key2=>"hamburger"}, {:key1=>"coffee", :key2=>"tea"}, {:key1=>"apple", :key2=>"orange", :key3=>"grape"}]
>> arry << foods << drinks << fruits
=> [{:key1=>"potato", :key2=>"hamburger"}, {:key1=>"coffee", :key2=>"tea"}, {:key1=>"apple", :key2=>"orange", :key3=>"grape"}]

 

それぞれ、インデックスを指定すると要素の値を取り出せます。

 

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
>> arry[0]
=> {:key1=>"potato", :key2=>"hamburger"}
>> arry[1]
=> {:key1=>"coffee", :key2=>"tea"}
>> arry[2]
=> {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
# 存在しないインデックスを指定するとnilが返される
>> arry[3]
=> nil
>> arry[0] => {:key1=>"potato", :key2=>"hamburger"} >> arry[1] => {:key1=>"coffee", :key2=>"tea"} >> arry[2] => {:key1=>"apple", :key2=>"orange", :key3=>"grape"} # 存在しないインデックスを指定するとnilが返される >> arry[3] => nil
>> 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"のみ取り出したいときを考えます。

 

要素数を指定し、更にキーを指定します。

 

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
>> arry[2]
=> {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
>> arry[2][:key2]
=> "orange"
>> arry[2] => {:key1=>"apple", :key2=>"orange", :key3=>"grape"} >> arry[2][:key2] => "orange"
>> arry[2]
=> {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
>> arry[2][:key2]
=> "orange"

 

キーを適切に指定しないと取り出せません。

 

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
>> 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
>> 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
>> 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の場合です。

 

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
>> hash
=>
{"foods"=>{:key1=>"potato", :key2=>"hamburger"},
"drinks"=>{:key1=>"coffee", :key2=>"tea"},
"fruits"=>{:key1=>"apple", :key2=>"orange", :key3=>"grape"}}
>> hash => {"foods"=>{:key1=>"potato", :key2=>"hamburger"}, "drinks"=>{:key1=>"coffee", :key2=>"tea"}, "fruits"=>{:key1=>"apple", :key2=>"orange", :key3=>"grape"}}
>> hash
=>
{"foods"=>{:key1=>"potato", :key2=>"hamburger"},
 "drinks"=>{:key1=>"coffee", :key2=>"tea"},
 "fruits"=>{:key1=>"apple", :key2=>"orange", :key3=>"grape"}}

 

キーを指定すると値を取得できます。

 

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
>> hash["foods"]
=> {:key1=>"potato", :key2=>"hamburger"}
>> hash["drinks"]
=> {:key1=>"coffee", :key2=>"tea"}
>> hash["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"}
>> hash["foods"]
=> {:key1=>"potato", :key2=>"hamburger"}
>> hash["drinks"]
=> {:key1=>"coffee", :key2=>"tea"}
>> hash["fruits"]
=> {:key1=>"apple", :key2=>"orange", :key3=>"grape"}

 

"orange"を取得したい場合は、2つのキーを指定すれば良いです。

 

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
>> hash["fruits"]
=> {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
>> hash["fruits"][:key2]
=> "orange"
>> hash["fruits"] => {:key1=>"apple", :key2=>"orange", :key3=>"grape"} >> hash["fruits"][:key2] => "orange"
>> hash["fruits"]
=> {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
>> hash["fruits"][:key2]
=> "orange"

 

こちらも配列と同様、 "": も正確に指定する必要はあります。

 

適切でない場合はnilやエラーが返ります。

 

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
>> 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>'
>> 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>'
>> 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
-, ,