1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【 JavaScript / Ruby 】JavaScriptと比較しながらRubyの "ハッシュとシンボル" について

Posted at

はじめに

最近、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レスポンス処理」などで必須の知識 なので、ぜひ違いを押さえて活用してきたいと思います。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?