ハッシュのデフォルト値を設定する
ハッシュオブジェクトに対して存在しないキーを指定して値を取得しようとすると、デフォルトでは「nil」が返されます。このデフォルト値を「nil」から別の値に設定しておくことが可能です。ここれでは Ruby のハッシュオブジェクトでデフォルト値を設定する方法を解説します。
(Last modified: )
new([ifnone])メソッドを使う
ハッシュのデフォルトの値を設定する 1 番目の方法は Hash
クラスの new
メソッドの引数にデフォルト値を設定する方法です。
h = Hash.new(ifnone)
new
メソッドを使用すると空のハッシュオブジェクトを作成できますが、デフォルト値が引数に指定した ifnone に設定されます。
具体的には次のように記述します。
h = Hash.new("none") v1 = h["Yamada"] v2 = h["Suzuki"] puts(v1) puts(v1.object_id) puts(v2) puts(v2.object_id) puts(h)
この構文で作成したハッシュオブジェクトに対して、存在しないキーを指定して値を取得すると、デフォルト値として設定された "none" が出力されます。なおデフォルト値として返されるオブジェクトは毎回同じオブジェクトが返されるため、二つのハッシュオブジェクトの object_id
は同じです。
また単に存在しないキーを指定した値を取得したときにデフォルト値を返しているだけで、そのキーを使った新しい要素がハッシュに追加されるわけではありません。そのため最後にハッシュオブジェクトを確認しても空( {}
)のままです。
new {|hash, key| ... }メソッドを使う
ハッシュのデフォルトの値を設定する 2 番目の方法は、先ほどと同じ new
メソッドですがブロック付きのものを使用する方法です。
Hash.new {|hash, key| ...}
この構文の場合も空のハッシュオブジェクトを作成しますが、デフォルト値にはブロック内の評価結果がデフォルト値として設定されます。
具体的には次のように記述します。
h = Hash.new { "none" } v1 = hash["Yamada"] v2 = hash["Suzuki"] puts(v1) puts(v1.object_id) puts(v2) puts(v2.object_id) puts(h)
この構文で作成したハッシュオブジェクトに対して、存在しないキーを指定して値を取得すると、デフォルト値としてブロック内を評価した結果として "none" が出力されます。ただデフォルト値として返されるオブジェクトは毎回異なるオブジェクトが返されるため、二つのハッシュオブジェクトの object_id
は異なります。
また単に存在しないキーを指定した値を取得したときにデフォルト値を返しているだけで、そのキーを使った新しい要素がハッシュに追加されるわけではありません。そのため最後にハッシュオブジェクトを確認しても空( {}
)のままです。
ブロックには引数が 2 つ渡されます。 1 番目の引数にはハッシュオブジェクト、 2 番目の引数にはキーとして指定したオブジェクトです。引数をブロック内で使用することでキー毎に異なるデフォルト値を設定することができます。
具体的には次のように記述します。
h = Hash.new {|hash, key| hash[key] = "none" } v1 = h["Yamada"] v2 = h["Suzuki"] puts(v1) puts(v2) puts(h)
この構文で作成したハッシュオブジェクトに対して、存在しないキーを指定して値を取得すると、デフォルト値としてブロック内を評価した結果として "none" が出力されます。また同時にハッシュオブジェクトに指定したキーとデフォルト値をペアとする新しい要素が追加されます。そのため最後にハッシュオブジェクトを確認すると {"Yamada"=>"none", "Takahashi"=>"none"}
と表示されます。
fetchメソッドを使う
デフォルトの値を設定する 3 番目の方法は Hash
クラスの fetch
メソッドの引数にデフォルト値を設定する方法です。
ハッシュオブジェクト.fetch(key[, default])
fetch
メソッドを使用すると引数に指定したキーに対する値を取得できますが、 2 番目の引数にデフォルト値を設定しておくと、ハッシュオブジェクトに指定したキーの要素がなかった場合にデフォルト値に指定したオブジェクトが返されます。
具体的には次のように記述します。
h = {"Yamada" => 34, "Katou" => 28, "Endou" => 18} v1 = h.fetch("Yamada", 0) v2 = h.fetch("Honda", 0) puts(v1) puts(v2)
上記ではキー "Yamada" に対しては 34 が返されますが、キー "Honda" は存在しないのでデフォルト値の 0 が返されます。
なお、new
メソッドを使ってデフォルト値を設定したハッシュオブジェクトを作成してた場合でも、 fetch
メソッドで値を取得する場合は無視します。そのため、存在しないキーを指定して値を取得すると KeyError
が発生します。
なお fetch
メソッドにはブロック付きのものも用意されています。
fetch(key) {|key| ... }
この場合は、デフォルト値にはブロック内の処理が実行された結果が返されます。ブロックには引数としてキーのオブジェクトが渡されてきます。
具体的には次のように記述します。
h = {"Yamada" => 34, "Katou" => 28, "Endou" => 18} v1 = h.fetch("Yamada") {|key| -1 } v2 = h.fetch("Honda") {|key| -1 } puts(h1) puts(h2)
上記ではキー "Yamada" に対しては 34 が返されますが、キー "Honda" は存在しないのでデフォルト値としてブロック内を評価した結果として -1 が返されます。
defaultメソッドを使う
デフォルトの値を設定する 4 番目の方法は Hash
クラスの default
メソッドを使用する方法です。
ハッシュオブジェクト.default = デフォルト値
default
メソッドでは現在のデフォルト値を取得したり、新しいデフォルト値を設定することができます。
具体的には次のように記述します。
h = Hash.new("none") puts(h.default) h.default = "undefined" puts(h.default)
上記では最初に new メソッドで設定したデフォルト値である「none」が出力され、そのあとで default メソッドを使って新しいデフォルト値が設定されるため「undefined」が出力されます。
では簡単なプログラムで確認してみます。
# encoding: UTF-8 h1 = Hash.new("none") puts("住所 : " + h1["Yamada"]) puts("住所 : " + h1["Suzuki"]) puts(h1) puts(); h2 = Hash.new{|hash, key| hash[key] = "undefined" } puts("住所 : " + h2["Yamada"]) puts("住所 : " + h2["Suzuki"]) puts(h2) puts(); h3 = Hash.new() puts("住所 : " + h3.fetch("Yamada","undefined")) puts("住所 : " + h3.fetch("Suzuki","undefined")) puts(h3) puts(); h4 = Hash.new() h4.default = "undefined" puts("住所 : " + h4["Yamada"]) puts("住所 : " + h4["Suzuki"]) puts(h4)
下記のように実行して下さい。
-- --
Ruby のハッシュオブジェクトでデフォルト値を設定する方法を解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。