読者です 読者をやめる 読者になる 読者になる

まりぴよこのブログ

日々の日記。技術ネタでまとまりきってないものの記録、伝わる文章の書き方を練習とか。

Ruby Koans で学ぶ Hash

今日はHash

要素にアクセス

  • hash.fetch
  • hash[]

キーを指定して値を取得する

fetchを使うと存在しないキーを取得しようとしたら、EyeError が発生する。 []ではnilが返る(エラーにならない)

Hashの ==

キー:値が一致していれば、順序がバラバラでも等しい

hash1 = { :one => "uno", :two => "dos" }
hash2 = { :two => "dos", :one => "uno" }
assert_equal true, hash1 == hash2

初期化時にデフォルト値を指定

hash2 = Hash.new("dos")
hash2[:one] = 1
assert_equal 1, hash2[:one]
assert_equal "dos", hash2[:two]

値を指定していないキーが渡された時、初期値("dos")を返してくる

デフォルト値は同じオブジェクト

Hashの初期値にオブジェクト(例:Arrayなど)を使いたい時

Bad(ダメケース)
hash = Hash.new([])

この方法で初期化してしまうと、どのキーにどんな値を入れても、同一のArrayに値が入ってしまう。

hash[:one] << "uno"
hash[:two] << "dos"
assert_equal ["uno", "dos"], hash[:one]
assert_equal ["uno", "dos"], hash[:two]
assert_equal ["uno", "dos"], hash[:three]
assert_equal true, hash[:one].object_id == hash[:two].object_id

キー :one, :two, :threeで、全て同一のArrayが使用されてしまう;;

じゃあどうする?

ブロックを使って初期化

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

こうするとそれぞれのキー毎に値を新しいArrayに入れられる。

のんびりした日曜日。。

かに

かにとやどかり

いい天気だったぁ〜♪