Ruby裡的Symbol是一種object,這種object包含了一個字串和一個數字(ruby內部使用的)。用字串前加一個":"來表示ex :foo。有三種方法產生symbol- :foo或:"foo"或 foo.to_sym,用foo.to_sym時foo必需是個string。
如 :foo 是一個Symbol的boject,裡面包含了"foo"的字串,及一個ruby內部使用的數字。
>:foo.to_s:foo是一種 Symbol的object,這個symbol的字串內容是"foo",而 symbol1也是。
=> "foo"
>symbol1 = :foo
=> :foo
>symbol1.to_s
=> "foo"
>:foo.class
=> Symbol
symbol的兩大特色是不可改變的及唯一的。也就是說:foo一定是包含"foo"這個字串,不能也不會改變。整個ruby裡也只會有一個:foo的object。
>symbol2 = :foosymbol1和symbol2的也都是symbol的object,但是由object id可知symbol1和symbol2和:foo都是同一個object。不管你怎麼使用就是只會有一個:foo。如果是string就不一樣了。
=> :foo
>:foo.object_id
=> 231138
>symbol1.object_id
=> 231138
>symbol2.object_id
=> 231138
>str1="foo"str1和str2是兩個不同的object。
=> "foo"
>str2="foo"
=> "foo"
>str1.object_id
=> 23518020
>str2.object_id
=> 23518030
symbol的主要用途有兩個,一個是節省記憶體的使用,另一個增進效率。
由於symbol在系統裡只會有一個,所以只用掉一次的記憶體空間,又因為他不會改變,所以你在那裡使用都不用擔心symbol的內容是否還一樣。這樣可以節省很多記憶體的使用,同樣的字串使用的越多次,改用symbol所節省記憶體的效益就越明顯。
另一個是symbol裡有一個ruby內部使用的數字,當你使用foo.action時,ruby需要比對字串去找到action這個method,如果用symbol就可以比對symbol的數字,這可以有效的提升效率。所以ruby會將你的foo.acion轉換成為foo.send(:action)以提升效率。
而symbol的比較也會比字串的比較有效率,symbol只需比較是不是同一個object即可(還記得嗎?symbol的字串是不會改變的)。
而將symbol用來做enumerations也是很常見的用法,如:RED, :BLUE, :GREEN。