はじめに
最近、Rubyを使った開発の勉強を始めました。
その中で「ハッシュ」と「シンボル」という言葉がよく出てくるのですが、最初は 文字列との違いや使い分け がよく分からず少し混乱しました。
特にJavaScriptに慣れていた自分にとっては、Ruby独特の「シンボル」の存在がちょっとややこしく感じました。
この記事では、そんな過去の自分と同じようにRubyを勉強している方に向けに
- ハッシュとは何か?
- シンボルとは何か?
- JavaScriptとの違い
- 実務での使いどころ
について、できるだけわかりやすく整理してみました!
自分の理解の整理も兼ねて書いていますので、どなたかの参考になれば嬉しいです😊
JavaScriptのオブジェクト ≒ Rubyのハッシュ
Rubyの Hash
は、JavaScriptのオブジェクト({ key: value })
と非常に似ています。
# Ruby
user = { name: "たろう", age: 20 }
// JavaScript
const user = { name: "たろう", age: 20 };
構文も用途もかなり似ていますが、Rubyのキーには「シンボル」や「文字列」など 複数の型が使える点 が違いです。
Rubyの「シンボル」とは?
Rubyの :name
のような表記は「シンボル(Symbol)」と呼ばれます。
:name # シンボル
特徴
特徴 | シンボル :name
|
文字列 "name"
|
---|---|---|
型 | Symbol |
String |
メモリ使用 | 少ない(使い回される) | 多い(毎回生成される) |
比較の速さ | 速い | 遅い |
表示や編集の用途 | 不向き | 向いている |
シンボルは「 軽量で、識別子的に使える文字列 ( 名前だけが欲しいときに使う、軽くて速いラベル ) 」のようなものと考えてください。
ハッシュのキーには非常によく使われます。
ハッシュのキー
user = {
name: "たろう",
age: 20
}
user[:name] # => "たろう" ⭐️コレ
JavaScriptとの比較
Ruby | JavaScript |
---|---|
:name |
"name" |
{ name: "たろう" } |
{ name: "たろう" } |
user[:name] |
user["name"] or user.name
|
シンボルは使い回される |
"name" は毎回文字列生成 |
Symbol(:name) は同一 |
Symbol("name") !== Symbol("name") |
JavaScriptの Symbol()
はユニーク性があるため、Rubyのシンボルとは性質が異なる点に注意してください。
実務での使い方例
1.APIレスポンスのパースにシンボルを使う
require 'json'
json = '{ "name": "たろう", "age": 20 }'
hash = JSON.parse(json, symbolize_names: true)
puts hash[:name] # => "たろう"
-
symbolize_names: true
により、キーが文字列ではなく:name
のようなシンボルになる。 - 実務では APIの受け取りやパラメータ管理 でよく使われます。
2.Railsでのパラメータ操作
params = { user: { name: "たろう", age: 20 } }
params[:user][:name] # => "たろう"
- Railsのコントローラーでは、paramsは通常シンボル でアクセスします。
- 例えば
params[:user][:email]
のようにアクセス。
3.キーワード引数と組み合わせる
def greet(name:, age:)
puts "こんにちは、#{name}さん(#{age}歳)"
end
greet(name: "たろう", age: 20)
- メソッド引数でも、ハッシュ+シンボル的な書き方が登場。
- JSでいう { name, age } = user 的な引数の受け方に似ています。
ハッシュの2通りの書き方
Rubyでは、以下の2通りの書き方があります
# 旧書き方
{ :name => "たろう", :age => 20 }
# 新しい省略書き方(Ruby 1.9以降)
{ name: "たろう", age: 20 }
- 両方とも同じ意味ですが、省略書き方(モダン記法) が推奨されます。
- JavaScriptに近い書き味になります。
まとめ
- Rubyのハッシュは JSのオブジェクトに似ている
- Rubyのシンボル(
:name
)は軽量でキーに適している - 実務ではパラメータ操作やAPIレスポンスに使われる
- JavaScriptの
Symbol()
とは別物なので注意
さいごに
Ruby初心者の方や、JavaScriptから入門した方の参考になれば嬉しいです!
実務でも 「パラメータの受け渡し」「設定ファイル」「APIレスポンス処理」などで必須の知識 なので、ぜひ違いを押さえて活用してきたいと思います。