Try   HackMD

Ruby 符號 Symbol

tags: Ruby

符號

符號 = 有名字的物件
an object with a name

1 是一個數字物件,
"aa" 是一個字串物件
:hello 是一個符號物件

符號不是變數,它就只是一個值(或說是一個物件)

:name = "123" # 語法錯誤 my_name = "孫悟空" # my_name 變數指向一個字串 your_name = :someone # your_name 變數指向一個符號

字串跟符號的差別

字串的內容可以變,但符號不行

name = "abcdefg" name[1] = "x" p name # "axcdefg"
name = :abcdefg name[1] = "x" p name # 錯誤

字串的效能稍微差一點點

puts "hello".object_id # 印出 70213995743900 puts "hello".object_id # 印出 70213995743760 puts "hello".object_id # 印出 70213995743700 puts "hello".object_id # 印出 70213995743640 puts "hello".object_id # 印出 70213995743580 puts :hello.object_id # 印出 1055708 puts :hello.object_id # 印出 1055708 puts :hello.object_id # 印出 1055708 puts :hello.object_id # 印出 1055708 puts :hello.object_id # 印出 1055708

「冷凍」字串?

puts "hello".freeze.object_id # 印出 70164486689200 puts "hello".freeze.object_id # 印出 70164486689200 puts "hello".freeze.object_id # 印出 70164486689200 puts "hello".freeze.object_id # 印出 70164486689200 puts "hello".freeze.object_id # 印出 70164486689200

字串與符號互相轉換

# 字串轉符號 p "name".to_sym # 印出 :name p "name".intern # 印出 :name # 符號轉字串 p :name.to_s # 印出 "name" p :name.id2name # 印出 "name"

該用字串還是符號?

不可變,選擇符號
可變,選擇字串