Hashクラスを使ったハッシュオブジェクトの作成

ハッシュオブジェクトの元になっているクラスは Hash クラスです。 Hash クラスのクラスメソッドを使ってハッシュオブジェクトを作成することもできます。ここでは Ruby で Hash クラスを使ってハッシュオブジェクトを作成する方法について解説します。

(2021 年 06 月 30 日公開 / 2022 年 10 月 18 日更新)

Hash[key,value,...]

1 つ目はクラスメソッドの [] を使用した形式です。

Hash[key,value,...]

ハッシュはキーと値のペアで 1 つの要素となりますが、この形式ではキーと値のオブジェクトを交互に指定していきます。そのため引数に指定するオブジェクトは必ず偶数個になります。

具体的には次のように記述します。

h = Hash["Yamada", 34, "Katou", 28, "Endou", 18]

3 つの要素を持つハッシュを作成しています。キーと値の組み合わせは ("Yamada", 34), ("Katou", 28), ("Endou", 18) となります。

クラスメソッドの [] を使用した形式は次の形式も使用できます。

Hash[key => value,...]

1 つの要素に対して「キー => 値」の形式で指定します。

具体的には次のように記述します。

h = Hash["Yamada" => 34, "Katou" => 28, "Endou" => 18]

作成されるハッシュオブジェクトは先ほどと同じです。

Hash.new([ifnone])

2 つ目はクラスメソッドの new を使用した形式です。

Hash.new([ifnone])

空のハッシュオブジェクトを作成します。引数「ifnone」にオブジェクトを指定した場合は、存在しないキーを指定した場合に返されるデフォルトのオブジェクトを nil から変更する事が出来ます。(デフォルトの設定については次のページで詳しく確認します)。

具体的には次のように記述します。

h = Hash.new()

要素が空のハッシュオブジェクトが作成されます。

Hash.new {|hash, key| ...}

3 つ目はブロック付きのクラスメソッドの new を使用した形式です。

Hash.new {|hash, key| ...}

空のハッシュオブジェクトを作成します。存在しないキーを指定した場合に返されるデフォルトのオブジェクトはブロック内の処理が実行されて返されます。(デフォルトの設定については次のページで詳しく確認します)。

具体的には次のように記述します。

h = Hash.new {|hash, key| hash[key] = "none"}

要素が空のハッシュオブジェクトが作成されます。上記ではデフォルトの値が「none」になるように指定しています。

Hash[hash]

4 つ目はクラスメソッドの [] を使用した形式です。引数に他のハッシュオブジェクトを指定します。

Hash[hash]

引数に指定したハッシュオブジェクトに含まれるキーと値を持つ新しいハッシュオブジェクトが作成されます。この時、コピー元とコピー先のハッシュに含まれるキーのオブジェクトと値のオブジェクトは同じオブジェクトとなります。

具体的には次のように記述します。

h1 = Hash["Yamada" => "Tokyo", "Katou" => "Nagano", "Endou" => "Aomori"]
h2 = Hash[h1]

上記ではハッシュオブジェクト「h1」と「h2」は同じ要素を持ちます。要素に含まれるキーと値は 2 つのハッシュで同じオブジェクトを参照します。

サンプルコード

では簡単なプログラムで確認してみます。

# encoding: UTF-8

h1 = Hash["Yamada" => "Tokyo", "Katou" => "Osaka"]
h2 = Hash[h1]

puts("コピー元")
h1.each do |key, val|
  puts("key:" + key.object_id.to_s + ", val:" + val.object_id.to_s)
end

puts("コピー先")
h2.each do |key, val|
  puts("key:" + key.object_id.to_s + ", val:" + val.object_id.to_s)
end

下記のように実行して下さい。

Hashクラス

ハッシュを元に別のハッシュを作成した場合、それぞれのハッシュに含まれるキーと値が同じオブジェクトを参照していることが確認できます。

-- --

Ruby で Hash クラスのクラスメソッドを使ってハッシュオブジェクトを作成する方法について解説しました。

( Written by Tatsuo Ikura )

広告
Profile
profile_img

著者 / TATSUO IKURA

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