我不知道我理解的標誌是什麼。我在不同的地方閱讀以下內容:符號在Ruby中
- 符號是不可變的,這意味着內容在初始化後不會改變。這意味着對象可以有很多引用,因爲內容不能改變。
- 使用符號的身份和字符串,其中的內容事項。
- Symbol對象僅實例化一次,並且只要該進程運行存在。
- 關於符號表
我不明白這些話。最後,我不明白符號對象是什麼。 :name
是一個符號對象,還是:name
只是對某個符號對象的引用?
我不知道我理解的標誌是什麼。我在不同的地方閱讀以下內容:符號在Ruby中
我不明白這些話。最後,我不明白符號對象是什麼。 :name
是一個符號對象,還是:name
只是對某個符號對象的引用?
也許這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」字符串每次都有一個不同的地址(意味着每次創建一個新對象),而符號不會改變。也許你可以將符號與單例關聯(如單例模式,而不是元編程方式),以便於理解。
你可以把符號作爲一種常量,但不包含實際值。在沒有符號語言,你可能爲了方便做這樣的事情:
const BLUE = 1
const GREEN = 2
my_color = GREEN
...
if (my_color == GREEN)
在Ruby中,你可以使用符號這樣的:
my_color = :green
...
if my_color == :green
這是更有效,因爲一個符號是僅僅是一個符號。它不存儲任何值或任何東西,所以你不需要初始化它們。我不確定Ruby解釋器中的符號是如何處理的,但我認爲這與任何新手ruby程序員都沒有關係。
一個很好的指南可以在這裏找到:
這個報價從書「Eloquent Ruby」幫助我理解的符號,有書中處理字符串和符號,這也是非常好的一整章。
答案是,我們傾向於使用字符的字符串在代碼中兩個晝夜溫差而 ferent目的:第一個,也是最明顯的,使用的字符串是保存一些數據 我們正在處理。閱讀從數據庫中的那些書的對象,你將很可能 有你的雙手滿弦的數據,東西之類的書,作者的 名,實際文本的標題。 我們使用字符串的第二種方式是在我們的pro- 克中表示事情,比如想要查找表中的所有記錄。最關鍵的事情有關 :所有在我們的書ActiveRecord的例子是,ActiveRecord的可以識別它時,它 看到它,代碼需要知道哪些記錄返回,並且:一切是說 它應該返回每個人的標誌。關於使用類似這樣的東西的好處是:對於這個「代表」責任的所有類型,它對人類來說也是有意義的:你可能會認識到更多的東西:當你遇到它時,意味着所有的東西都比0更合適,或-1,甚至 (天堂禁止!)0x29ef。 這兩種用於字符串的方法 - 一方面用於 上的常規數據處理任務,另一方面用於內部符號標記類型的作業,這使得對對象的不同要求變得非常不同。如果您正在處理數據,那麼您將希望使用整個範圍的字符串操作工具:您可能需要第一個 標題的十個字符,或者您可能想要獲取它的長度或查看它是否與 某些匹配正則表達式。另一方面,如果您在代碼中使用某些字符來代表 ,那麼您可能不會對 實際字符造成太大興趣。相反,在第二種情況下,你只需要知道這個東西 是告訴你找到所有記錄還是僅僅是第一條記錄的標誌。主要是,當你想要一些字符代表某些東西時,你只需要知道這是否與012.相同,快速而可靠。
本文可能也有興趣http://www.robertsosinski.com/2009/01/11/the-difference-between-ruby-symbols-and-strings/,因爲它幫助我瞭解符號與字符串的不同之處。
我認爲符號最好通過用例來解釋。
創建常量時,它們比整數更具表現力。
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")
這會比使用符號效率低。
A Symbol
實例是一組有序的字符。 String
實例是一個字符容器,它可以包含任何字符序列。
從來沒有聽說過那本書,看起來很有趣。感謝您分享該鏈接! – LuckyLuke