ハッシュ


    Rubyのハッシュ

    ハッシュはユニークなキーが付いたオブジェクトを入れるコンテナ(容器)で、次のように{}(波括弧)を用いて変数に代入する。

    変数 = {キー1 => オブジェクト1, キー2 => オブジェクト2, …}

    その後、オブジェクトを参照したり代入するときは、次のようにキーを指定する。

    変数[キー]
    fruits = {"banana" => "バナナ", "apple" => "りんご", "orange" => "オレンジ"}
    fruits["tomato"] = "トマト"
    puts fruits["apple"] # りんご

    シンボル

    上の例ではキーが文字列になっているが、シンボルにすることもできる。シンボルは名前・ラベルのようなもの。先頭に:(コロン)を付けた文字列だが、"は省略できる。

    :"シンボル名"
    :シンボル名

    キーをシンボルにしたハッシュ

    キーをシンボルにしたハッシュの場合、シンボル名の末尾に:を付けた次の書式も使える。

    変数 = {シンボル名: オブジェクト, シンボル名: オブジェクト, …}
    
    # 参照はこう
    変数[:シンボル名]
    # どちらでもいい。
    fruits = {:banana => "バナナ", :apple => "りんご", :orange => "オレンジ"}
    fruits = {banana: "バナナ", apple: "りんご", orange: "オレンジ"}
    puts fruits[:apple] # りんご

    キーをまとめて取り出す: keysメソッド

    キーをまとめて配列として取り出すのはkeysメソッド。

    fruits = {banana: "バナナ", apple: "りんご", orange: "オレンジ"}
    keys = fruits.keys
    puts keys

    出力はこうなる。

    banana
    apple
    orange

    オブジェクトをまとめて取り出す: valuesメソッド

    オブジェクトをまとめて配列として取り出すのはvaluesメソッド。

    fruits = {banana: "バナナ", apple: "りんご", orange: "オレンジ"}
    values = fruits.values
    puts values

    出力はこうなる。

    バナナ
    りんご
    オレンジ

    ハッシュにキーが存在するか確認: key?メソッド

    ハッシュにキーが存在するか確認するには、key?メソッド。has_key?include?member?メソッドも同じ。

    fruits = {banana: "バナナ", apple: "りんご", orange: "オレンジ"}
    puts fruits.key?(:tomato) # false

    ハッシュにオブジェクトが存在するか確認: value?メソッド

    ハッシュにオブジェクトが存在するか確認するには、value?メソッド。has_value?メソッドも同じ。

    fruits = {banana: "バナナ", apple: "りんご", orange: "オレンジ"}
    puts fruits.value?("りんご") # true

    ハッシュのサイズ: sizeメソッド

    ハッシュに含まれている要素の数を調べるには、sizeメソッド。lengthメソッドも同じ。

    fruits = {banana: "バナナ", apple: "りんご", orange: "オレンジ"}
    puts fruits.size # 3

    ハッシュが空か調べる: empty?

    ハッシュに何も含まれていないか確認するには、empty?メソッド。

    fruits = {} # 空のハッシュ作成
    puts fruits.size # 0
    puts fruits.empty? # true

    キー指定でハッシュの要素削除: deleteメソッド

    ハッシュに含まれる要素(キーとそのオブジェクト)をキーを指定して削除するには、deleteメソッド。

    fruits = {"banana" => "バナナ", "apple" => "りんご", "orange" => "オレンジ"}
    fruits.delete("banana")
    puts fruits.key?("banana") # false