ハッシュのデフォルト値を設定する

ハッシュオブジェクトに対して存在しないキーを指定して値を取得しようとすると、デフォルトでは「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 )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。