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)
シンボルはハッシュのキーとしてよく用いられる
「文字列とシンボルを比較した場合」の項目を見るとわかるように、文字列と比較すると、パフォーマンスの良さがわかると思います。
そして、よくハッシュの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, }