シンボルとは
公式ドキュメントより
シンボルは、ソース上では文字列のように見え、内部では整数として扱われる、両者を仲立ちするような存在です。
Rubyの内部実装では、メソッド名や変数名、定数名、クラス名など の`名前'を整数で管理しています。これは名前を直接文字列として処理するよりも 速度面で有利だからです。そしてその整数をRubyのコード上で表現したものがシンボルです。
シンボルは任意の文字列と一対一に対応するオブジェクトです。
文字列の代わりに用いることもできますが、必ずしも文字列と同じ振る舞いをするわけではありません。同じ内容のシンボルは必ず同一のオブジェクトです。
ruby
:id == :id
出力結果 =>true
名前を管理するという役割上、シンボルと文字列は一対一に対応します。 また、文字列と違い、immutable (変更不可)であり、同値ならば必ず同一です。
シンボルを使うメリットは
新しく文字列を生成しない分やや効率がよく、比較も高速。
文字の意味がはっきりするのでコードが読みやすくなる
immutable なので内容を書き換えられる心配がない
イミュータブル(変更不可)とは
ruby
str1 = :abc
str2 = "abc"
puts str1.object_id #出力結果=>1195228
puts :abc.object_id #出力結果=>1195228 #変数に代入されても変わらない
puts str2.object_id #出力結果=>60
puts "abc".object_id #出力結果=>80 #変数に代入することで 60=>80に変わった
str2 = "abc"
puts str1.object_id #出力結果=>1195228
puts :abc.object_id #出力結果=>1195228
puts str2.object_id #出力結果=>60 #str2 = "abc"代入された後でも変わらない
puts "abc".object_id #出力結果=>100 #変数に代入されたことでまた変わる
ミュータブルとは
conversion_rates = {
usd: 1.0,
jpy: 110.0,
eur: 0.8
}
conversion_rates["ars"]= 0.4
p conversion_rates
#出力結果 =>{:usd=>1.0, :jpy=>110.0, :eur=>0.8, "ars"=>0.4}
ハッシュはミュータブルですので、要素の追加を行うことで変更させることができました。
シンボルと文字列は同じ扱いか?
ruby
puts :abc != "abc" #出力結果 =>true
puts :abc.object_id #出力結果=>1195228
puts "abc".object_id #出力結果=>60
object.idは違いますね
ドル → 日本円に変換するプログラムを考えてみた
conversion_rates = {
usd: 1.0,
jpy: 110.0,
eur: 0.8
}
#金額、変換元の通貨、変換先の通貨
def convert_currency(amount, source_currency, target_currency, conversion_rates)
x = conversion_rates[source_currency]
y = conversion_rates[target_currency]
puts amount/x*y
end
#メソッドの実行
convert_currency(100, :usd, :jpy, conversion_rates)
#出力結果 =>11000