Ruby on Rails

【Ruby on Rails5.2】RubyやRailsでよく使われるコロンの正体はシンボル

・教材でよく使われているコロン(:)の存在が気になったのでメモ
・Rubyの構文、シンボルと呼ぶとのこと。文字列との違いを紹介

はじめに

変わらずRailsの学習中です。教材は終盤に差し掛かっているのですが、コロン(:)の存在が気になりました。

・Hashに使われているパターン(配列名A[:id])
・変数の後にコロンが付いているパターン(変数A: true)
・前後に付いているパターン(変数A: :変数B)
色んな使い方が存在していて混乱しました。

他の言語ではあまり見たこと無いので備忘も兼ねてアウトプットします。

コロンは何者なのか

結論から言いますと、コロンは「シンボル」と呼ばれます。
Railsでは無く、Rubyの書き方です。

Rubyは全てがオブジェクトのためシンボルもシンボルクラスと呼ばれ、他のクラスとは別扱いです。

int1 = 100
strA = 'strrr'
symZ = :symbbbb
puts int1.class
puts strA.class
puts symZ.class

クラスが違うため厳密には別なのですが、コロンの後ろにあるものが文字として扱われるため文字列(String)と類似のようです。
内部では全然違う管理であり、シンボルクラスは整数で管理しています。
なのでStringクラスとシンボルクラスの比較はString.to_symなどの変換が必要です。

Ruby 2.0.0 リファレンスマニュアル – class Symbol
https://docs.ruby-lang.org/ja/2.0.0/class/Symbol.html

シンボルを表すクラス。シンボルは任意の文字列と一対一に対応するオブジェクトです。
Rubyの内部実装では、メソッド名や変数名、定数名、クラス名など の`名前’を整数で管理しています。

文字列ではなくシンボルを使う理由としては速度面や可読性などのメリットがあるようです。

前置コロン

上記の通りシンボルは内部では整数管理しているため重複は許さないです。
そのためHashでのキーにシンボルを利用するには相性が良いです。

hash = {:name=>"Osusu", :location=>"Japan", :message=>"よろしくお願いします。"}
puts hash[:name]
puts hash[:location]
puts hash[:message]

後置コロン

「名前: 値」のようなパターンは後置コロンと呼ばれます。
こちらもHashでよく使われており、前置コロン時の書き方をもう少し省略出来ます。

hash = {name: "Osusu", location: "Japan", message: "よろしくお願いします。"}
puts hash[:name]
puts hash[:location]
puts hash[:message]

「キー+コロン」の形にすることで「=>」を省略出来ます。
呼ぶ場合は「コロン+キー」(前置コロン)で呼びます。

コロンが混在しているパターン

前置コロン、後置コロンで若干使い方が違うためすでに混乱していますがもう1つ混乱するパターンがあります。
Hashを関数に渡すときです。

Rubyでは引数の最後がHashの場合、Hash特有の中カッコ({})を省略出来ます。
同時に、RailsのActiveRecordはシンボルで渡すため1つの関数に前置コロンと後置コロンが混在します。
RailsだとValidatesがイメージしやすいと思います。

validates :name, presence: true, length: {maximum: 30}

上記の場合、validatesメソッドの第1引数にはシンボル「:email」を渡します。
第2引数がHashとして渡しています。中カッコを省略しないと以下のような形となります。

validates :name, {presence: true, length: {maximum: 30}}

中カッコを省略出来る仕様は便利かもしれませんが、慣れていないと戸惑いますね。

参考記事

https://rails-study.net/symbol/