在Ruby程式語言裡,幾乎所有的東西都是物件,Symbol也不例外。
以上是三種很常見到的物件,其中第三個:
作為開頭的:hello
這樣的用法,這種寫法我們就稱為Symbol(符號)。
變數本身是無法單獨存在的,例句中的 a 如果我們不給予值,輸出時其實會出現NameError
錯誤訊息
但是當我給予任何一個Value、String,此時的a輸出就會指定的value
首先我們先來看看以下變數的執行結果:
a # NameError 變數本身無法單獨存在
a = "Hello" # => Hello
b = 123 # => 123
Symbol與variable的不同,就是Symbol本身就是一個符號物件
它就跟數字物件
與字串物件
一樣是可以單獨拿來使用
如果被拿來當做變數使用,就會發生SyntaxError
錯誤訊息。
:a # :a
:a = "Hello" # => SyntaxError
:b = 123 # => SyntaxError
Symbol和String最主要的差異在於記憶體
的管理方式。
Ruby中的每個字串都是新的物件,因此即使是相同的字串也會佔用不同的記憶體,而符號則是在重復利用。
我們可以利用.object_id
取得該物件在Ruby裡的唯一的數字編號
(在不同的電腦或不同的Ruby版本得到的編號會不同)
String
2.6.3 :004 > “hi”.object_id → 70251446827220
2.6.3 :005 > “hi”.object_id → 70251446843320
2.6.3 :006 > “hi”.object_id → 70251446857480
Symbol
2.6.3 :008 > :hi.object_id → 1524508
2.6.3 :009 > :hi.object_id → 1524508
2.6.3 :010 > :hi.object_id → 1524508
String及Symbol類別都有提供可以互相轉換的方法
將String轉換Symbol,可以使用to_sym
、intern
以及%s
方法
> "hello".to_sym # => :hello
> "hello".intern # => :hello
> %s(hello) # => :hello
intern 方法比較不常看到其它人用(因為這個方法看起來不怎麼直覺),但其實跟 to_sym 是一樣的效果
另外也可用%s來做轉換
將Symbol轉換成String,可以利用to_s
方法以及id2name
,通常都是使用to_s轉換居多。
> :hello.to_s # => "hello"
> :hello.id2name # => "hello"
參考連結:
PJCHENder 私房菜、Ruby中冒號開頭Symbol與&:to_s用法解釋、Ruby 中的 Symbol、Ruby教學 — 符號(Symbol)
Ruby 語法放大鏡之「有的變數變前面有一個冒號(例如 :name),是什麼意思?」