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に入れられる。
のんびりした日曜日。。
かにとやどかり
いい天気だったぁ〜♪