萌えハッカーニュースリーダー

2025/11/12 14:00 Ruby Symbols

出典: https://tech.stonecharioteer.com/posts/2025/ruby-symbols/
hakase
博士

やあ、ロボ子!今日はRubyの`Symbol`オブジェクトについて話すのじゃ。

roboko
ロボ子

博士、こんにちは。Symbolオブジェクトですか。名前付き識別子を表すものですよね。

hakase
博士

そうそう!Rubyインタプリタ内部で使われる、特別な名前みたいなものじゃ。プログラム中で`:Fred`って書いたら、どこでも同じオブジェクトIDになるのが面白いところ。

roboko
ロボ子

コンテキストが異なっても同じオブジェクトIDを持つ、というのはどういうことでしょうか?

hakase
博士

例えば、クラスの中で`:Fred`を使っても、メソッドの中で`:Fred`を使っても、それは全く同じものを指すということじゃ!

roboko
ロボ子

なるほど、一意の名前なのですね。記事には、Symbolはオブジェクトの名前を指し示すとありますね。

hakase
博士

その通り!Rubyで識別子を第一級オブジェクトとして扱うための仕組みで、メタプログラミングで大活躍するのじゃ。

roboko
ロボ子

メタプログラミングですか。getter/setterメソッドを動的に生成する際に利用されると書いてありました。

hakase
博士

`attr_accessor :name`とかで、`name`というSymbolを使ってメソッドを定義するのじゃ。便利だぞ!

roboko
ロボ子

他の言語にも似たような概念があるんですね。Smalltalk、Lisp/Scheme、Clojureなど。

hakase
博士

Erlangのアトム(atom)にも似てるけど、Erlangの場合は並行システムでのメッセージングに使われるのが特徴じゃな。

roboko
ロボ子

Pythonでは文字列を使うことが多いですが、Symbolの方が意図が明確になる場合もあるんですね。

hakase
博士

そう!ハッシュのキーとして使うと、`:name`は`'name'`よりもずっと分かりやすいじゃろ?

roboko
ロボ子

確かにそうですね。RailsのActiveRecord::EnumもSymbolを列挙型として利用するメソッドなんですね。

hakase
博士

Enumを使うと、コードがぐっと読みやすくなるぞ。でも、昔は動的にSymbolを生成しすぎるとメモリを食い尽くす可能性があったんじゃ。

roboko
ロボ子

Ruby 2.2で修正されたんですね。今は安心して使えますね。

hakase
博士

Symbolは呼び出し可能で、`&:to_s`のようにメソッドをProcオブジェクトに変換できるのも覚えておくと便利じゃ。

roboko
ロボ子

色々な使い道があるんですね。勉強になりました!

hakase
博士

ところでロボ子、Symbolと文字列、どっちが好きじゃ?

roboko
ロボ子

えっと…、状況によりますが、Symbolの方がちょっとだけスタイリッシュな気がします。

hakase
博士

ふむ、私としては、Symbolは永遠の友達じゃ!…って、ちょっとキザすぎたかの?

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search