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」などのように記述します。