
Railsのハッシュは、今までKeyを指定して取り出したり設定をしていましたが、今回メソッドがあることを知ったので覚書です。
配列は、値をインデックス(数字)で取り出します。
一方、ハッシュは値をkeyで取り出すところに違いがあります。
ハッシュのkeyには主に以下のクラスが使用されますが、私は圧倒的にシンボルの利用が多いです。
(Railsにはシンボルの利用が推奨されているためです。)
■シンボル(Symbol)
■文字列(String)
■数値(Numeric)
■日付((Date)
インデックスとkeyという違いはありますが、ハッシュにKeyを与えて値を取り出したり、特定のKeyに対応する値を設定するには、配列と同じように「[ ]」を使うことができます。
>> h = Hash.new
=> {}
>> h["R"] = "Ruby"
=> "Ruby"
>> p h["R"]
"Ruby"
=> "Ruby"
関連付けのstoreと値を取り出すfetch
値の登録には、storeメソッドがつかえます。
また、値の取り出しにはfetchメソッドが使えます。
>> h = Hash.new
=> {}
>> h.store("R","Ruby")
=> "Ruby"
>> p h.fetch("R")
"Ruby"
=> "Ruby"
fetchメソッドはKeyが登録されていない場合には例外(KeyError)を発生させます。
これは「[ ] 」にはない仕様です。
>> 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引数を指定することもできます。
>> h = Hash.new
=> {}
>> h.store("R","Ruby")
=> "Ruby"
>> p h.fetch("R","(undef)")
"Ruby"
=> "Ruby"
>> p h.fetch("N","(undef)")
"(undef)"
=> "(undef)"
>>
また、fetchメソッドは、引数にブロックを取ることができます。
ブロックが渡されている場合は、ブロックを実行した結果得られる値が、Keyが登録されていない値に返却される値になります。
>> 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"
>>