Railsにおけるシンボルの概要と利点
Railsでコードを組んでいるとよく「:cat」のようなものを見かけると思います。これは「シンボル」と呼ばれ、名前を示すオブジェクトです。見た目は文字列ですが、実際バックでは整数として扱われます。Raislではよく登場し、使いこなせるようになるとコードも綺麗に描けるようになります。とりあえずは、シンボルの概要について見ていきましょう。
同じ名前のシンボルは何回作られても「同じ」とみなされ、メモリを節約する。
一度生成されるとシンボルがポインタとなり、複数回使用しても同じ領域を使用して値を扱うことができます。また、シンボルは同一の名前であれば同じものとして扱われます。
逆に文字列は記述するたびに生成され、同じ名前であっても内部では違うものとして扱われます。文字列を使用した場合は宣言するたびに文字列の領域が生成されます。
そのためシンボルの方が、メモリを節約することができます。実際にどういうことなのか見ていきましょう。
str1 = "fish" str2 = "fish" p str1.object_id p str2.object_id =>23122440 =>23122420
オブジェクトのIDは異なります。つまり異なるメモリ領域が消費されているわけです。一方、シンボルはどうでしょうか。
sym1 = :fish sym2 = :fish p sym1.object_id p sym2.object_id =>892188 =>892188
オブジェクトのIDは同じですね。つまり同じメモリ領域が使われています。このようにシンボルでは同じ名前は同じオブジェクトとして認識されるので、メモリを節約できるというわけです。
配列のキーとして便利
シンボルを理解する上で一番分かりやすいのが、Hashのキーとしてシンボルを使う場合でしょう。
ハッシュを作る際に簡単な記述で配列を作ることができます。通常はハッシュを作る際に以下のように記述します。
dog = { "name" => "pochi", "kind" => "shibaken" } しかし、シンボルを使うと以下のようになります。 dog = {name: "pochi", kind: "shibaken" }
非常にシンプルにハッシュを書くことができます。
日本語も指定できる
シンボルは英語だけではなく、日本語も指定可能です。
data = {:名前=>"Nobuo", :住所=>"Osaka", :メッセージ=>"よろしくお願いします"} p data[:名前] p data[:住所] p data[:メッセージ] => "Nobuo" => "Osaka" => "よろしくお願いします"
メソッド名も指定できる
class MembersController < ApplicationController before_action :set_text def index end def new end private def set_text @text = "Hello" end end
「before_action」により各アクションを実行する前に、「set_text」メソッドが実行されます。メソッドを「:set_text」と書いて指定しています。
変数及びアクセサメソッドを一発で作成
attr_accessorメソッドに引数「 :name」を渡しています。
class Person attr_accessor :name end
上のコードは下のコードと同じです。
class Person def name= name @name = name end def name @name end end
「attr_accessor :name」という1行で、以下の3つを定義しています。
- @name というインスタンス変数
- name= というセッターメソッド
- name というゲッターメソッド
非常にすっきりしていますね。ちなみにいくつも作りたい時は「attr_accessor :name, :age, :sex」などのように記述します。