初學ruby的時候,往往對字元串(string類)與符号(symbol)這兩種變量類型分不清楚,其實,我們大可不必糾纏這兩種變量類型的内部實作,隻需記住它們的特點和差別就可以了:
不管字元串變量也好,符号變量也好,都是用來表示文本的,它們之間,也可以互相轉換(通過to_sym和to_s):
>> "book".to_sym
=> :book
>> :track.to_s
=> "track"
這就是符号和字元串最大的差别,符号是不可變的,不能對一個符号進行修改。是以說,兩個看起來相同的符号一定是一個對象,但是說兩個看起來一樣的字元串是一個對象,就不對了。
這裡,我們用 equal? 方法檢驗這一點,當兩個對象相同時,equal? 傳回true,反之是false:
>> :book.equal?(:book)
=> true
>> "book".equal?("book")
=> false
這也就是為什麼有些時候我們要使用符号的原因,由于字元串變量必須具有各種修改其内容的功能,是以字元串的維護和處理的開銷就很大,但是有些時候,我們并不需要修改和處理建立的文本資訊,這個時候用符号再好不過了。
比較典型的用法,就是在rails中,用符号來指代散列中的參數名稱:
<% for article in @articles -%>
<%= link_to article.title,
:controller => "article",
:action => "show",
:id => article.id %>
<% end -%>
反之,如果我們把 :controller 寫成"controller",把 :action 寫成"action",吧 :id 寫成"id",每一個循環都要建立3個新的字元對象,但是我們又不需要對這些字元串進行修改操作,白白添加了很多處理器開銷,而且寫成符号的形式更加簡練,可以更容易分别出參數和值,何樂而不為呢。