iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 28
0

Symbol符號

在Ruby程式語言裡,幾乎所有的東西都是物件,Symbol也不例外。

  • 1 數字物件
  • "hi" 字串物件
  • :hello 符號物件

以上是三種很常見到的物件,其中第三個作為開頭的:hello這樣的用法,這種寫法我們就稱為Symbol(符號)。

Symbol 與 variable 的不同

變數本身是無法單獨存在的,例句中的 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 的不同

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

Symbol 與 String 轉換

String及Symbol類別都有提供可以互相轉換的方法
將String轉換Symbol,可以使用to_symintern以及%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),是什麼意思?」


上一篇
Day27 | Rails 的 Spring 指令
下一篇
Day29 | Partial Render
系列文
從色彩繽紛到只看亂碼日子,學程式從 Ruby 出發!30

尚未有邦友留言

立即登入留言