leaning diary Rails

【Learning Diary42】ハッシュの値をメソッドで取り出す・設定する

【Learning Diary42】ハッシュの値をメソッドで取り出す・設定する

 

Railsのハッシュは、今までKeyを指定して取り出したり設定をしていましたが、今回メソッドがあることを知ったので覚書です。

 

配列は、値をインデックス(数字)で取り出します。

 

一方、ハッシュは値をkeyで取り出すところに違いがあります。

 

ハッシュのkeyには主に以下のクラスが使用されますが、私は圧倒的にシンボルの利用が多いです。

 

(Railsにはシンボルの利用が推奨されているためです。)

 

■シンボル(Symbol)

■文字列(String)

■数値(Numeric)

■日付((Date)

 

インデックスとkeyという違いはありますが、ハッシュにKeyを与えて値を取り出したり、特定のKeyに対応する値を設定するには、配列と同じように「[ ]」を使うことができます。

 

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
>> h = Hash.new
=> {}
>> h["R"] = "Ruby"
=> "Ruby"
>> p h["R"]
"Ruby"
=> "Ruby"
>> h = Hash.new => {} >> h["R"] = "Ruby" => "Ruby" >> p h["R"] "Ruby" => "Ruby"
>> h = Hash.new
=> {}
>> h["R"] = "Ruby"
=> "Ruby"
>> p h["R"]
"Ruby"
=> "Ruby"

 

関連付けのstoreと値を取り出すfetch

値の登録には、storeメソッドがつかえます。

 

また、値の取り出しにはfetchメソッドが使えます。

 

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
>> h = Hash.new
=> {}
>> h.store("R","Ruby")
=> "Ruby"
>> p h.fetch("R")
"Ruby"
=> "Ruby"
>> h = Hash.new => {} >> h.store("R","Ruby") => "Ruby" >> p h.fetch("R") "Ruby" => "Ruby"
>> h = Hash.new
=> {}
>> h.store("R","Ruby")
=> "Ruby"
>> p h.fetch("R")
"Ruby"
=> "Ruby"

 

fetchメソッドはKeyが登録されていない場合には例外(KeyError)を発生させます。

 

これは「[ ] 」にはない仕様です。

 

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
>> p h.fetch("N")
(irb):8:in `fetch': key not found: "N" (KeyError)
from (irb):8:in `<main>'
from /Users/tokudome/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.8.3/exe/irb:9:in `<top (required)>'
from /Users/tokudome/.rbenv/versions/3.2.2/bin/irb:25:in `load'
from /Users/tokudome/.rbenv/versions/3.2.2/bin/irb:25:in `<main>'
>> p h.fetch("N") (irb):8:in `fetch': key not found: "N" (KeyError) from (irb):8:in `<main>' from /Users/tokudome/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.8.3/exe/irb:9:in `<top (required)>' from /Users/tokudome/.rbenv/versions/3.2.2/bin/irb:25:in `load' from /Users/tokudome/.rbenv/versions/3.2.2/bin/irb:25:in `<main>'
>> p h.fetch("N")
(irb):8:in `fetch': key not found: "N" (KeyError)
    from (irb):8:in `<main>'
    from /Users/tokudome/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.8.3/exe/irb:9:in `<top (required)>'
    from /Users/tokudome/.rbenv/versions/3.2.2/bin/irb:25:in `load'
    from /Users/tokudome/.rbenv/versions/3.2.2/bin/irb:25:in `<main>'

 

Keyの登録がない場合に返却される値として、第2引数を指定することもできます。

 

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
>> h = Hash.new
=> {}
>> h.store("R","Ruby")
=> "Ruby"
>> p h.fetch("R","(undef)")
"Ruby"
=> "Ruby"
>> p h.fetch("N","(undef)")
"(undef)"
=> "(undef)"
>>
>> h = Hash.new => {} >> h.store("R","Ruby") => "Ruby" >> p h.fetch("R","(undef)") "Ruby" => "Ruby" >> p h.fetch("N","(undef)") "(undef)" => "(undef)" >>
>> h = Hash.new
=> {}
>> h.store("R","Ruby")
=> "Ruby"
>> p h.fetch("R","(undef)")
"Ruby"
=> "Ruby"
>> p h.fetch("N","(undef)")
"(undef)"
=> "(undef)"
>>

 

また、fetchメソッドは、引数にブロックを取ることができます。

 

ブロックが渡されている場合は、ブロックを実行した結果得られる値が、Keyが登録されていない値に返却される値になります。

 

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
>> h = Hash.new
=> {}
>> p h.fetch("N"){String.new}
""
=> ""
>> p h.fetch("N"){Hash.new}
{}
=> {}
>> h.store("R","Ruby")
=> "Ruby"
>> p h.fetch("R"){String.new}
"Ruby"
=> "Ruby"
>>
>> h = Hash.new => {} >> p h.fetch("N"){String.new} "" => "" >> p h.fetch("N"){Hash.new} {} => {} >> h.store("R","Ruby") => "Ruby" >> p h.fetch("R"){String.new} "Ruby" => "Ruby" >>
>> h = Hash.new
=> {}
>> p h.fetch("N"){String.new}
""
=> ""
>> p h.fetch("N"){Hash.new}
{}
=> {}
>> h.store("R","Ruby")
=> "Ruby"
>> p h.fetch("R"){String.new}
"Ruby"
=> "Ruby"
>>

 

 

 

-leaning diary, Rails