Ruby Symbol

Ruby 教學 8 – Ruby Symbol Object 介紹以及和 String Object 比較

Ruby Symbol object 因為和 String object 有某些相似的地方,因此滿常被拿來和 String object 比較,這篇就來介紹一下 Symbol object 以及和 String object 的一些比較。

1. 宣告 Ruby Symbol Object

和 Integer object, Float object 一樣,Symbol object 無法用 class.new 的方式宣告,可以用直接賦值的方式 ( 在想宣告的名字前面加上: ) 宣告:

sym1 = :name

p sym1
# :name
p sym1.class
# Symbol

sym2 = :'name is Jimmy'

p sym2
# :"name is Jimmy"
p sym2.class
# Symbol

age = 25
sym3 = :"name is Jimmy #{age} years old"

p sym3
# :"name is Jimmy 25 years old"
p sym3.class
# Symbol

2. Symbol Methods

2.1 Symbol length/size

會回傳 Symbol 的長度:

sym = :name

p sym.length
# 4
p sym.size
# 4

2.2 Symbol []

可以用 .[] 來存取 Symbol 的 value,會以 String object 回傳:

sym = :name

p sym.[](0)
# "n"
p sym[0]
# "n"
p sym.[](0).class
# String

2.3 Symbol name

.name 會將 Symbol 以 String object 的形式回傳:

sym = :jimmy

p sym.name
# "jimmy"
p sym.name.class
# String

2.4 Symbol inspect

.inspect 會聯同 : 加上 name 以 String object 的形式回傳:

sym = :jimmy

p sym.inspect
# ":jimmy"

2.5 Symbol upcase

會將 Symbol 全部轉成大寫:

sym = :jimmy

p sym.upcase
# :JIMMY

2.6 Symbol downcase

會將 Symbol 全部轉成小寫:

sym = :JIMMY

p sym.downcase
# :jimmy

2.7 Symbol Capitalize

會將 Symbol 轉成第一個字大寫,其他小寫:

sym = :JIMMY

p sym.capitalize
# :Jimmy

2.8 Symbol to_s

將 Symbol 轉換成 String object:

sym = :jimmy

p sym.to_s
# "jimmy"

3. Ruby Symbol v.s. String

2.1 Immutable

Symbol 和 String object 不一樣的地方是 immutable,也就是賦值後不能改變:

str = "name"
sym = :name

p str[0]
# "n"
p sym[0]
# "n"

str[0] = "j"
sym[0] = "j"
# Error! undefined local variable or method `sym' for main:Object

2.2 記憶體位置

2.2.1 String

每當 new 一個 String object 時,Ruby 會宣告一個記憶體位置來存放這個 String object,即便 String object 的 value 一樣。

str1 = "jimmy"
str2 = "jimmy"

p str1.object_id
# 60
p str2.object_id
# 80

2.2.2 Symbol

因為 Symbol immutable 的特性,如果宣告兩個的 Symbol 是一樣的,那會指向同一個記憶體位置:

sym1 = :jimmy
sym2 = :jimmy

p sym1.object_id
# 1061148
p sym2.object_id
# 1061148

2.3 效能

因為 Symbol 上的 methods 比 String 少很多,因此宣告這兩個 object 時所佔的記憶體空間也有差:

require 'objspace'

str = "name"
sym = :name

p str.methods.length
# 183
p sym.methods.length
# 87

p ObjectSpace.memsize_of(str)
# 40
p ObjectSpace.memsize_of(sym)
# 0

3. 參考資料

Learn to Code with Ruby
Ruby Symbols vs. Strings
Day07 – Ruby比一比: Symbol符號與String字串
Class: Symbol (Ruby 3.1.2)

如果覺得我的文章有幫助的話,歡迎幫我的粉專按讚哦~謝謝你!

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top