【 第4回】Ruby初心者向け!配列とハッシュの違いとは?
配列とハッシュは用意されているメソッドも似たようなものばかり。
それでは、実際にどういった点が違うのか?
今回はRubyにおける配列とハッシュの違いを紹介します。
Rubyの配列とハッシュは似ている?
配列とハッシュはRubyで使われる基本的なコンテナオブジェクトです。いずれも他のオブジェクトへの参照を保持することができます。
イメージとしては1つの変数の中に、オブジェクトへの参照が順番に並んでいるものが、配列。
キーに対応した値を複数所持しているものがハッシュです。
1つの変数に複数のオブジェクトへの参照を保持しているという点では似ていますね。
それもそのはずで、配列のArrayクラスやハッシュのHashクラスはEnumerableモジュールを継承しています。
ここではEnumerableモジュールについては割愛しますが、イメージとしては配列とハッシュの親が同じような感じでしょうか。
同じEnumerableモジュールを継承しているのでArrayクラスやHashクラスが持つメソッドは共通するものが多いです。
配列とハッシュの違いを視覚的に見てみる
配列はオブジェクトへの参照が順番に並んでいるものでしたね。
一方、ハッシュはオブジェクトへの参照がキーごとにバラバラに並んでいる状態になります。
配列のイメージは順番に並べられたトランプ。
左から先頭はJ、最後尾は3と一目瞭然ですね。
それに対してハッシュはバラバラに置かれたトランプ。
全く整列していませんが、K=13、A=1とキーと値で表すことができます。
配列では「先頭から2番目のトランプを取って」で通じますが、ハッシュに関しては順番に並んでいるわけではないので、▲番目のトランプでは通じません。
ハートのクイーンのカードを取ってと指定する必要があります。つまり、キーを指定するということです。
配列とハッシュの比較から違いを見てみる
ここまで配列とハッシュの違いがぼんやりと理解できたかと思います。
配列は1番目、2番目・・・と順番に並んでいるもの。
ハッシュはバラバラになったもの。
実際に比較からその違いも見ていきましょう。
array1 = [1,2,3]
array2 = [1,2,3]
ここに1~3までの数値を保持したarrya1とarray2の配列を用意しました。
こちらの2つの配列を比較すると結果はどのようになるでしょうか?
array1 == array2 => true
結果は同じ配列と見なされるのでtrueが返ってきます。2つの変数の間に==を入れると両端の変数を比較するという意味です。
完全一致するとtrueを返し、それ以外はfalseを返します。
次に配列の中身を少々入れ替えましょう。
array2 = [2,1,3]
array2の配列の中身を少し入れ替えました。これを比較してみるとどういった結果が返ってくるでしょうか?
array1 = [1,2,3]
array2 = [2,1,3]
array1 == array2
=> false #出力結果
今度はfalseが返ってきました。0番目に入っている値が1,2と異なるのでこういった結果になりました。
それでは次に同じような感じでハッシュで試してみましょう。
array1 = {:one =>1, :two =>2, :three =>3}
array2 = {:two =>2, :one =>1, :three =>3}
array1 == array2 => true #出力結果
今回はtrueの結果が返ってきました。
これは、あくまでハッシュは順番に並んでおらずキーを目印にバラバラに並んでいるからです。
先ほどのバラバラに置かれたトランプのようなものです。
繰り返しますが、ハッシュには配列のように1番目、2番目という順番がありません。
あくまで目印になるのはキー(シンボル)です。
上記の例は順番が変わっているように見えますが、キーとそれに対応する値は変わらないので比較をしてもtrueが返ってきます。
しかし、順番ではなくキーと値を変更すると当然falseを返します。
array1 = {:one =>1, :two =>2, :three =>3}
array2 = {:one =>2, :two =>1, :three =>3}
#oneとtwoの値を差し替えた array1 == array2 => false
まとめ
今回、Rubyの配列とハッシュの違いについて紹介しました。
同じモジュールを継承するので一見、似ているような感じがしますがそれぞれの違いを抑えておきましょう。
▼関連記事
【第1回】Ruby初心者向け!ターミナルで動くコードを書いてみる