Ruby初心者的學習筆記 — 符號Symbol

Ruby初心者的學習筆記 — 符號Symbol

符號是什麼? 在Ruby的世界中,在字元前面加上:(冒號),即為符號(symbol)。

符號是什麼樣的概念? 有人說,符號可以想像為一個「帶有名字的物件」,

搜尋了一些日本網站後,

(畢竟Ruby的老爸是日本人嘛,搜尋日本網站也是很合理的)

發現了一個有趣的形容:

「符號是披著字串皮的數字」

為什麼會這樣形容呢?

讓我們來看一下“符號”、“字串”、“數字”的比較。

字串(String) 字串大概是所有程式語言最常使用的東西了。

在Ruby要建立字串,可以採用以下3種方法:

my_name = String.new("apple")

my_name = "apple"

my_name = 'apple'

其中又以第2種較常使用。

而如果將字串“apple”指向2個不同變數,再用object_id方法取得各自的id,會發現即使都是“apple”,卻有不同的object id,代表它們是不同的物件。

my_name = "apple"
her_name = "apple"

puts my_name.object_id  # => 70364243722720
puts her_name.object_id # => 70364243722700

而用迴圈方式連續取得“apple”的object id的結果如下,

5.times do
  puts "apple".object_id
end

# => 70194034783920
# => 70194034783340
# => 70194034783140
# => 70194034782760
# => 70194034782600

可以證明每次產出的“apple”字串都是不同的物件。

數字(Number) 在Ruby的世界裡,數字也是物件。

如果將剛剛字串用過的方法套用在數字上,會發生什麼事呢?

my_number = 689
your_number = 689

puts my_number.object_id   # => 1379
puts your_number.object_id # => 1379

雖然不知道1379是怎麼算出來的,但可知相同的數字內容代表著相同的物件。

用迴圈得出的結果也是一樣。

5.times do
  puts 689.object_id
end

# => 1379
# => 1379
# => 1379
# => 1379
# => 1379ß

符號(Symbol) 最後來看符號。

在Ruby的世界中,字串和符號是相對應的。

要將字串轉成符號,可使用

“name”.to_sym 或 ”name”.intern。

而要將符號轉成字串,則使用

:name.to_s 或 :name.id2name。

以下先將剛剛的“apple”轉成符號,再取得object_id。

my_name = "apple"
her_name = "apple"

my_name.to_sym # => :apple
her_name.to_sym # => :apple

puts my_name.to_sym.object_id  # => 70092130299700
puts her_name.to_sym.object_id # => 70092130299700

id相同,代表是同一個物件。

(小補充:如果執行my_name.intern.object_id,結果也是一樣的。)

5.times do
  puts :apple.object_id
end

# => 1056028
# => 1056028
# => 1056028
# => 1056028
# => 1056028

而迴圈得出的結果也可證明這裡的:apple是相同物件。

(但跟上面字串轉符號的:apple就不相同了。)

結論 雖然:apple表面上看起來跟”apple“長得比較像,但因為產出後便一直佔據記憶體的相同位置,和數字的特性較為接近,難怪符號要被稱為「披著字串皮的數字」了。

參考資料:

Rubyのシンボルは文字列の皮を被った整数だ!

為你自己學Ruby on Rails

Recent post