2016年10月20日 星期四

Ruby 中的 Symbols 識別

使用 Ruby 或 Elixir 時,其中的 Symbols 的功用。

透過 Ref 得知 Symbols 特性:

  •  Symbols 不是 "輕量化" 的字串,更像是 ID 之類的東西
  • 這個 ID 識別是透過 冒號 " : " 後面接著的文字,所以這個文字重複了,也不會一樣
  • 這個 Symbols 比喻為 ID 的依據是 object_id, 每個物件產生之後,物件 id 會不一樣,但 symbols 都是一樣的。
範例:

目前有兩個狀態機來表示目前機器運作情況:

machine_status = :open

當判別到 :open 時,表示機器開機。

當判別到 :closed 時,表示機器關機。


用 String 判斷狀態也可以阿,為何要用 Symbols?
  1.  要是用字串 "open" ,每次物件都會產生,可能會浪費記憶體。
  2.  Symbols 一經過產生,透過無數次調用,都不會再次產生記憶體。

Symbols 比較 String:

物件 id 是否一致


:hello.object_id == :hello.object_id //true
"hello".object_id == "hello".object_id //false

由此可知,字串調用每次都會經過記憶體產生。

就算使用 String 操作,也建議用變數裝著 String ,並重複使用,避免產生過多浪費的記憶體。

Reference:
https://www.ruby-lang.org/zh_tw/documentation/ruby-from-other-languages/
http://www.troubleshooters.com/codecorn/ruby/symbols.htm
http://www.randomhacks.net/2007/01/20/13-ways-of-looking-at-a-ruby-symbol/
http://stackoverflow.com/questions/2341837/understanding-symbols-in-ruby
http://ithelp.ithome.com.tw/articles/10161202

沒有留言:

張貼留言

© ERIC RILEY , 自由無須告知轉貼
Background Japanese Sayagata by Olga Libby