Ruby

Rubyのハッシュとシンボル

はじめに

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"}

ハッシュにシンボルを使うメリット

メモリ消費が少なく、パフォーマンスが高いというメリットがあるそうです。

以上です。

参考