プログラミング

【Ruby】ハッシュに使う文字列とシンボルの違い【使い方編】

この記事のターゲット

  • Rubyを勉強中で、ハッシュの項にたどり着いた人
  • なんとなく勉強していたけど、文字列とシンボルの違いが説明できない人
  • Ruby勉強中のいまの自分

あくまで使い方の違いについての言及であり、本質的に何が違うか?はこの記事ではお話ししません。(そこまで理解できていません…)

Rubyにおけるハッシュと配列の基本

ハッシュとは、キーと値がペアになって保存される配列のようなものです、のようなものと表記しているのは違ったら困るからです。

ハッシュ

example = {} #これでハッシュができる

# 普通に代入する場合はこうなる

example = { "name" => "Jun", "gender" => "male" }

# 出力はこうする
puts example["name"]
Jun

# ハッシュを出力するとこうなる
puts example
{"name"=>"Jun", "gender"=>"male"}

配列

ハッシュじゃなくて、配列もちゃんとあります。配列の場合はキーが存在せずに、0から始まる数字がインデックスとなって順番に格納されます。

array = [] #配列ができる

# 配列の代入
array = ["help!", "I need", "Somebody."] #Beatlesです

# 配列の出力
puts array
help!
I need
Somebody.

# 1個ずつ取り出す場合
puts array[0]
help!

puts array
I need

シンボルと文字列の違い

さて前述のハッシュですが、キーとしてシンボルと文字列のどちらでも使うことができます。この2つの違いをみていきます。

# 文字列
string = {"name" => "Jun", "gender" => "male" }

# 出力方法
puts string["name"]
Jun

# シンボル
symbol = { :name => "Jun", :gender => "male" }

# 出力方法
puts symbol[:name]
Jun

# シンボル別パターン
symbol = { name: "Jun", gender: "male" }

# 出力方法
puts symbol[:name]
Jun

シンボルの代入方法は2通りありますが、呼び出すときはどちらも同じ方法だというのがポイントですね。別パターンと書いていますがprogateの講座では省略形と書かれていたので、省略形として覚えた方が良いでしょう。

代入するときに省略しているだけなので、呼び出すときは同じ方法で呼び出します。

覚えておくと良いこと

以下は覚えておいた方が良さそうなことを羅列します。随時追記するかも

存在しないハッシュを呼び出す

存在しないハッシュキーをputsなどで読んだとき、Null pointer Exceptionになりそうな気もしますが、なりません。単純に出力結果が何もないだけです。(戻り値はnil)

example = { name: "Jun", gender: "male" }

puts example[:age]
    #←ageは存在しないのでなにも出力されない

if文に使う

存在しないハッシュをif文の条件式で使うと結果はfalseになります。

example = { name: "Jun", gender: "male" }

if example[:age]
  puts "年齢は#{example[:age]}です。"
else
  puts "年齢がわかりません。"
end

# 結果
年齢がわかりません。

配列とハッシュを合わせて使う

ユーザの管理とかに主に使われているようです。Ruby on Railsチュートリアルでも頻繁に出てくる形ですね。

# 配列にハッシュを入れる
users = [
  { name: "Jun", gender: "male" },
  { name: "Taro", gender: "male" }
]

# 配列から要素を取り出す。[]が2個並ぶのが特徴
puts users[:name]
Taro

# 各配列を取り出して良い感じに使う
users.each do |user|
  puts "#{user[:name]}の性別は#{user[:gender]}です。"
end