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" >>