2011-07-17 18 views
5

我一直在尋找過去的日子如何理解Ruby中的符號。我閱讀了Google上關於Ruby符號的每篇文章,其中大多數都是不好的解釋,所以我來到這裏,我發現有關於這個主題的一些問題存在,但我不明白,對不起。無法在Ruby中獲得符號的吊墜

從我讀過的內容中我瞭解到符號是不可變的和獨特的,所以內存消耗和性能比普通字符串要好。

問題#1
符號的目的是在生活中服務與字符串相同的利基?符號的目的是作爲方便的常量而不需要攜帶值,就像後面的部分一樣:是實際值嗎?

問題2
我什麼時候才知道在哪裏使用符號?

我會高度評價您自己對符號的解釋,而不是鏈接到Google上的文章(我確保已經閱讀過它!)。

如果您可以提供更多關於符號的信息,而不是我已經在這裏提出的問題,我也會認真考慮您的時間,因爲我根本不理解它們,甚至不是存儲在:symbol_something中,是參考還是什麼?

非常感謝您的幫助!

+0

[Understanding Ruby in Understanding](http://stackoverflow.com/questions/2341837/understanding-symbols-in-ruby) –

回答

6

ruby​​中的符號是一種有效利用不可變字符串的方法。例如,假設你想使用字符串「my_key」作爲散列鍵。簡單地使用字符串會浪費空間和效率,因爲每次指定散列鍵「my_key」時,即使字符串值內容相同,您仍在不同的內存位置創建不同的字符串實例!所以如果你有100個my_hash實例['my_key'],你有100個字符串'my_key'的實例。符號不是這樣的:my_key。無論您使用多少次,只有一次:my_key!

您應該使用通常使用不可變字符串作爲標識符的符號。

+1

謝謝,那真的很簡單嗎? –

+3

@Frank Zimmer:基本上。符號不是任何深奧的魔法。關於符號的好處在於「爲什麼」而不是「如何」。「當你看到一個字符串時,你需要想知道它是指文本還是特殊標記(如果你看到字符串low作爲函數的參數,是否告訴函數某事應該包含全小寫字符串「低」,或者它應該有低優先級?)。Ruby中的字符串用於第一種情況,第二種是符號。 – Chuck

+0

@Chuck:很好的解釋,你應該已經回答了。 –

1

理解這一點的方法是認爲String是一個Ruby對象,並且它沒有被指定爲不可變的。因此,語言處理器不能使用一些優化,而代碼讀者可能會或可能不會理解給定的字符串是作爲可變數據結構發揮作用還是作爲某種關鍵。

但符號不可變,所以它們有獨特的實例。他們也很容易打字,並且使用符號清楚地表明「標識符」「令牌」以後任何人閱讀代碼。

最後,Symbol類實現了顯式轉換#to_s,這樣的符號是安全的在你知道#to_s將被稱爲表達式,如在ERB templates或I/O操作使用。