Rubyのハッシュ、キーはシンボル?文字列? #Ruby - Qiita

はじめに

Rubyでは頻繁に使われるハッシュ(Hash)ですが、キーの書き方に2種類あるのをご存じでしょうか?

# シンボル風
{ name: "Alice", age: 30 }

# ロケット記法
{ "name" => "Alice", "age" => 30 }

この2つ、パッと見は似ているけど、キーの型が違います。意外と見落としがちな違いと、どう使い分けるべきかを、実例とともに解説します。

1. ハッシュの2つの書き方

シンボル記法(省略スタイル)

user = { name: "Alice", age: 30 }
p user 
# 内部的にこう解釈されます
# => {:name=>"Alice", :age=>30}

つまり、キーは :name や :age というシンボル型です。

ロケット記法

user = { "name" => "Alice", "age" => 30 }
p user 
# 内部的にこう解釈されます
# => {"name"=>"Alice", "age"=>30}

こちらは文字列型のキー。

この違いが、後でアクセスする際に影響を与えます。

2. キーの型を確認してみよう

user1 = { name: "Alice" }
user2 = { "name" => "Alice" }

p user1.keys   # => [:name]
p user2.keys   # => ["name"]

p user1[:name]     # => "Alice"
p user1["name"]   # => nil

シンボルと文字列は全くの別物なので、アクセスも合わせる必要があります。

3. 使い分けの原則と比較

シーン 推奨キー 理由
固定された属性(名前・年齢など) シンボル 軽量で高速。明示的な用途に最適
ユーザー入力、外部データ(JSONなど) 文字列 実行時に変化するため、文字列の方が適している

4. 具体的な使い分けサンプル

サンプル1:ユーザープロファイル(シンボル)

profile = {
  name: "Alice",
  age: 30,
  email: "alice@example.com"
}

p profile[:email]  # => "alice@example.com"

ポイント: キーがコード内で固定されているならシンボルがスマート。


サンプル2:フォーム入力のパラメータ(文字列)

params = {
  "name" => "Bob",
  "age" => "25"
}

p params["name"]  # => "Bob"
p params["age"]  # => "25"
p params[:age]  # => nil

ポイント: WebアプリやCLIでのユーザー入力は基本文字列で扱われる。

サンプル3:JSONなど外部データの読み込み(文字列)

require 'json'

data = JSON.parse('{"name":"Carol","age":22}')
p data["name"]  # => "Carol"

混ぜると危険!

user = {
  "name" => "Dave",
  name: "David"
}

p user.keys
# => ["name", :name]

見た目は同じでも別キーとして扱われるため、意図しないデータの重複やバグの元に。

6. シンボルと文字列の変換Tips

# 文字列 → シンボル
p "name".to_sym  # => :name
# シンボル → 文字列
p :name.to_s  # => "name"

# ハッシュのキーをシンボルに変換
hash1 = { "name" => "Alice", "age" => 30 }
p hash1.transform_keys(&:to_sym)
# => {:name=>"Alice", :age=>30}

# ハッシュのキーを文字列に変換
hash2 = { name: "Alice", age: 30 }
p hash1.transform_keys(&:to_s)
# => {"name"=>"Alice", "age"=>30}

終わりに

まとめ

  • シンボルと文字列は見た目が似ていても全く違う型。
  • 固定キーはシンボル、動的なキーは文字列と覚えると使い分けやすい。
  • どちらかに統一することが、コードの読みやすさ・バグ回避に繋がる。

Rubyのハッシュはとても柔軟だからこそ、キーの型に意識を向けることで、より読みやすく安全なコードになります。迷ったときはこの記事に立ち返ってみてください!

また、株式会社シンシアでは、実務未経験のエンジニアの方や学生エンジニアインターンを採用し一緒に働いています。
※ シンシアにおける働き方の様子はこちら

弊社には年間100人程度の実務未経験の方に応募いただき、技術面接を実施しております。
この記事が少しでも学びになったという方は、ぜひ wantedly のストーリーもご覧いただけるととても嬉しいです!



フラッグシティパートナーズ海外不動産投資セミナー 【DMM FX】入金

Source link