はじめに
RailsやRubyなどで、Webアプリケーション作成をしていて、Rubyのハッシュとシンボルの理解が曖昧だったので、勉強した記録をまとめました。
まずRubyのハッシュと、配列との違い
- ハッシュは「複数のデータをまとめて格納できるオブジェクト」という点において配列と同じ
- 異なる点
- インデックスとして整数値以外でも使える
- (一般的な)ハッシュでは要素の
並び順
が保証されない(が、Rubyのハッシュは追加された順序が保持される)
- ハッシュは
キー
とそれに対する値
のペアでデータを管理することができる - Rubyの場合、ハッシュの
キー
は、何らかのオブジェクト(文字列やシンボルなど) - 他言語では連想配列とも呼ばれる
ハッシュ
ハッシュとは、キーと値を組み合わせて保持するデータ構造です。
user = { "first_name" => "john", "last_name" => "lenon" }
puts user
=> {"first_name"=>"john", "last_name"=>"lenon"}
配列
配列とは、複数のデータをまとめて格納できるオブジェクトで、その意味においてはハッシュと同じです。
ただし、配列は任意のキーではなく、0から始まる数値(index)で要素の位置を指定します。
number = ["one", "two", "three"]
puts number
=>
one
two
three
puts number[0]
=>
one
puts number[1]
=>
two
puts number[2]
=>
three
シンボルを用いたハッシュ
シンボルとは?
シンボルとは主に文字列にコロン(:
)を前に置いて定義したものです(ただし!文字列を"_"
で囲む必要はありません)。たとえば、ハッシュのキーとしてシンボルを使う際は、コロンの後に置く場合もシンボルとなるケースがあります。ただ、通常は前に置きます。
シンボルはオブジェクト
文字列とほぼ同じですが、メソッドや、ハッシュの値のキーなどの名前を識別するためのラベルなので、微妙に違います。
str = "string"
puts str.class
=> String
sym = :symbol
puts sym.class
=> Symbol
classメソッドは、そのオブジェクトがどのクラスに属しているかを返します。
ハッシュはシンボルにも使える
上の例文で、下記のように書きましたが
user = { "first_name" => "john", "last_name" => "lenon" }
puts user
=> {"first_name"=>"john", "last_name"=>"lenon"}
キーがシンボルの場合、以下のようにハッシュリテラルを短く書く記法があります。
user = { first_name: "john", last_name: "lenon" }
puts user
=> {:first_name=>"john", :last_name=>"lenon"}
ハッシュにシンボルを使うメリット
メモリ消費が少なく、パフォーマンスが高いというメリットがあるそうです。
- https://blog.isao.co.jp/organize-array-and-hash-and-symbol-of-ruby/
- https://www.sejuku.net/blog/13094
以上です。