9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Ruby初心者】シンボルの使い方でつまづいたこと

Last updated at Posted at 2019-11-27

#はじめに
元々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、シンボルと同名のメソッドを呼び出す

以上

9
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?