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?

シンボルとは?

Posted at

シンボルとは

公式ドキュメントより

シンボルは、ソース上では文字列のように見え、内部では整数として扱われる、両者を仲立ちするような存在です。
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
0
0
1

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?