0
0

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-07-25

Rubyのシンタックスを息を吸うように書くために、少しでも理解が怪しいシンタックスを繰り返したくために書きます。

前提知識

文字列とシンボルを比較した場合

  • 基本的にはシンボルは文字列よりも高速に処理できる
    • (その背景1) シンボルはRubyの内部では整数として扱われる
    • (その背景2) シンボルは同じシンボルであれば同じobject_idを持つ特徴があるためメモリの使用効率がいい
    • (その背景3) 文字列は同じ文字列であれば異なるobject_idを持つ
    • (その背景4) 文字列はミュータブルなので破壊的な変更が可能 / シンボルはイミュータブルなので不可能
p :ruby
p :ruby.class
p 'ruby'
p 'ruby'.class

=> :ruby
=> Symbol
=> "ruby"
=> String

その背景2と3の証明

シンボルは同じシンボルであれば同じobject_idを持つ特徴があるためメモリの使用効率がいい。
文字列は同じ文字列でも異なるobject_idを持つ。ことの証明

return

p :ruby.object_id
p :ruby.object_id
p :ruby.object_id
p 'ruby'.object_id
p 'ruby'.object_id
p 'ruby'.object_id

=> 664668
=> 664668
=> 664668
=> 70246727800420
=> 70246727800100
=> 70246727798620

その背景4の証明

文字列は破壊的な変更が可能 / シンボルは不可能。ことの証明

return

p 'ruby'.upcase!
p :ruby.upcase!

=> "RUBY"
=> undefined method upcase! for :ruby:Symbol (NoMethodError)

参考: プロを目指す人のためのRuby入門_152p

シンボルはハッシュのキーとしてよく用いられる

「文字列とシンボルを比較した場合」の項目を見るとわかるように、文字列と比較すると、パフォーマンスの良さがわかると思います。
そして、よくハッシュのkeyとして用いられています。

上と下は、同じです。

languages = { 'ruby' => 'rails', 'php' => 'laravel', 'python' => 'django', }
languages = { ruby: 'rails', php: 'laravel', python: 'django', }

keyがシンボルになる場合、=>すら省略できます。その場合、シンタックスはkey: 'value'になります。コロンの位置が変わることに注意。

また、valueがシンボルにもなり得ます。

例えば、

languages = { ruby: 'rails', php: 'laravel', python: 'django', }

上記を、下記のように使うことも場合によっては良い方法もあります。

languages = { ruby: :rails, php: :laravel, python: :django, }
0
0
2

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?