2011-07-14 65 views
4

我不知道我理解的標誌是什麼。我在不同的地方閱讀以下內容:符號在Ruby中

  • 符號是不可變的,這意味着內容在初始化後不會改變。這意味着對象可以有很多引用,因爲內容不能改變。
  • 使用符號的身份和字符串,其中的內容事項。
  • Symbol對象僅實例化一次,並且只要該進程運行存在。
  • 關於符號表

我不明白這些話。最後,我不明白符號對象是什麼。 :name是一個符號對象,還是:name只是對某個符號對象的引用?

回答

3

也許這IRB會話可以明確的事情了一點:

irb(main):001:0> "First".object_id 
=> 23849064 
irb(main):002:0> "First".object_id 
=> 23842248 
irb(main):003:0> "First".object_id 
=> 23835432 
irb(main):004:0> "First".object_id 
=> 23828616 
irb(main):005:0> :First.object_id 
=> 301892 
irb(main):006:0> :First.object_id 
=> 301892 
irb(main):007:0> :First.object_id 
=> 301892 
irb(main):008:0> :First.object_id 
=> 301892 
irb(main):009:0> 

想象object_id方法爲類似於對象的地址。正如你所看到的,「First」字符串每次都有一個不同的地址(意味着每次創建一個新對象),而符號不會改變。也許你可以將符號與單例關聯(如單例模式,而不是元編程方式),以便於理解。

2

你可以把符號作爲一種常量,但不包含實際值。在沒有符號語言,你可能爲了方便做這樣的事情:

const BLUE = 1 
const GREEN = 2 

my_color = GREEN 

... 


if (my_color == GREEN) 

在Ruby中,你可以使用符號這樣的:

my_color = :green 

... 

if my_color == :green 

這是更有效,因爲一個符號是僅僅是一個符號。它不存儲任何值或任何東西,所以你不需要初始化它們。我不確定Ruby解釋器中的符號是如何處理的,但我認爲這與任何新手ruby程序員都沒有關係。

一個很好的指南可以在這裏找到:​​

4

這個報價從書「Eloquent Ruby」幫助我理解的符號,有書中處理字符串和符號,這也是非常好的一整章。

答案是,我們傾向於使用字符的字符串在代碼中兩個晝夜溫差而 ferent目的:第一個,也是最明顯的,使用的字符串是保存一些數據 我們正在處理。閱讀從數據庫中的那些書的對象,你將很可能 有你的雙手滿弦的數據,東西之類的書,作者的 名,實際文本的標題。

我們使用字符串的第二種方式是在我們的pro- 克中表示事情,比如想要查找表中的所有記錄。最關鍵的事情有關 :所有在我們的書ActiveRecord的例子是,ActiveRecord的可以識別它時,它 看到它,代碼需要知道哪些記錄返回,並且:一切是說 它應該返回每個人的標誌。關於使用類似這樣的東西的好處是:對於這個「代表」責任的所有類型,它對人類來說也是有意義的:你可能會認識到更多的東西:當你遇到它時,意味着所有的東西都比0更合適,或-1,甚至 (天堂禁止!)0x29ef。

這兩種用於字符串的方法 - 一方面用於 上的常規數據處理任務,另一方面用於內部符號標記類型的作業,這使得對對象的不同要求變得非常不同。如果您正在處理數據,那麼您將希望使用整個範圍的字符串操作工具:您可能需要第一個 標題的十個字符,或者您可能想要獲取它的長度或查看它是否與 某些匹配正則表達式。另一方面,如果您在代碼中使用某些字符來代表 ,那麼您可能不會對 實際字符造成太大興趣。相反,在第二種情況下,你只需要知道這個東西 是告訴你找到所有記錄還是僅僅是第一條記錄的標誌。主要是,當你想要一些字符代表某些東西時,你只需要知道這是否與012.相同,快速而可靠。
+0

從來沒有聽說過那本書,看起來很有趣。感謝您分享該鏈接! – LuckyLuke

1

我認爲符號最好通過用例來解釋。

創建常量時,它們比整數更具表現力。

def rgb(color_symbol) 
    return nil unless color_symbol.is_a? Symbol 
    case color_symbol 
    when :red; { r: 255, g: 0, b: 0 } 
    when :green; { r: 0, g: 255, b: 0 } 
    when :blue; { r: 0, g: 0, b: 255 } 
    else; { r: 0, g: 0, b: 0 } 
    end 
end 

p rgb(color_symbol= :red) 

,符號只是通過其獨特的地址相比較,比

def rgb(color_number) 
    return nil unless color_number.is_a? Fixnum 
    case color_number 
    when 1; { r: 255, g: 0, b: 0 } 
    when 2; { r: 0, g: 255, b: 0 } 
    when 3; { r: 0, g: 0, b: 255 } 
    else; { r: 0, g: 0, b: 0 } 
    end 
end 

p rgb(color_number= 2) 

對於條件語句比較更具可讀性,所以他們不是字符串,這是由長度相比更有效,然後每一個字符。

def rgb(color_string) 
    return nil unless color_string.is_a? String 
    case color_string 
    when "red"; { r: 255, g: 0, b: 0 } 
    when "green"; { r: 0, g: 255, b: 0 } 
    when "blue"; { r: 0, g: 0, b: 255 } 
    else; { r: 0, g: 0, b: 0 } 
    end 
end 

p rgb(color_string= "blue") 

這會比使用符號效率低。

0

A Symbol實例是一組有序的字符。 String實例是一個字符容器,它可以包含任何字符序列。