#はじめに
元々PHPをやっていたのですが、Rubyに触ってみて一週間経ちました。
参考書を2冊読んだのですが、一番わからないポイントがシンボルについてでした。
今回はシンボルについての記事です。
#:apple?
参考書を60ページくらい読んだら出てきました。
:apple.class #=> Symbol
'apple'.class #=> String
初めてみる記法です。
Ruby使いは左側にコロンのついてるものをシンボルと呼ぶらしいです。
##主な特徴
###同じシンボルであれば全く同じオブジェクトである
str1 = "string"
str2 = "string"
p str1.equal?(str2) #=> false
p str1.object_id #=> 70332245439420
p str2.object_id #=> 70332245439400
sym1 = :symbol
sym2 = :symbol
p sym1.equal?(sym2) #=> true
p sym1.object_id #=> 901148
p sym2.object_id #=> 901148
シンボルは1つのオブジェクトを参照しているものなので、右側の値が同じならシンボルは同じものになる。
→ String型に比べて、メモリを消費しない
参考記事:Rubyの文字列とシンボルの違いをキッチリ説明できる人になりたい
https://qiita.com/Kta-M/items/53a13ef60e14fcb41193
##シンボルの使い方
###連想配列のキーとして使われる
#文字列をキーにする連想配列
{'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee'}
#これのキーをシンボルにすると次のようになる
{:japan => 'yen', :us =>'dollar', :india => 'rupee'}
配列のキーをシンボルにすることによって、データの抽出が高速になる
(理由:Rubyのプログラムはシンボルのデータを整数として持っているので、データの処理が速くなる)
###シンボルと同名のメソッドを呼び出す使い方
class User
attr_reader :first_name, :last_name, :age
def initialize(first_name, last_name, age)
@first_name = first_name
@last_name = last_name
@age = age
end
end
シンボルが出てきました。
attr_reader :first_name, :last_name, :age
attr_readerは書き換えはできないけど、インスタンスにおいて指定したプロパティを読み込めますという設定にするものみたいです。
でもなんでattr_readerで指定してるのがシンボルなのかわからなくなりました。
・・・
どうやらこれは、同名のメソッドを呼び出ししているみたいです。
:first_name → first_nameのメソッド
attr_reader :first_nameを設定すると、
class User
def initialize(first_name)
@first_name = first_name
end
def first_name
@first_name
end
end
とした時と、同じことになるみたいです。(attr_readerを設定すると同名のゲッターメソッドを作成する)
今回はattr_readerで設定をしているので、first_nameのゲッターを呼び出しているが、
attr_accessorで設定をすると、ゲッターとセッターで呼び出すみたいです。
これまでとは違ったシンボルの使い方ですね
似たような使い方で
['ruby', 'java', 'perl'].map(&:upcase)
#を次のように変更(条件付き)
['ruby', 'java', 'perl'].map{|s| s.upcase}
がありました。これもシンボルと同名のメソッドを呼び出しているみたいですね。
参考記事: Rubyのmap(&:name)というのはどういう意味?
https://qa.atmarkit.co.jp/q/35
#まとめ
2つのシンボルの使い方があることを理解しました。
1、連想配列のキーにつかう
2、シンボルと同名のメソッドを呼び出す
以上