Ruby中字符串和符號之間的區別是什麼以及什麼時候應該使用另一個?Ruby中的字符串和符號有什麼區別?
回答
主要區別在於代表單個值的多個符號是相同的,而字符串則不然。例如:
irb(main):007:0> :test.object_id
=> 83618
irb(main):008:0> :test.object_id
=> 83618
irb(main):009:0> :test.object_id
=> 83618
3引用符號:測試,所有相同的對象。
irb(main):010:0> "test".object_id
=> -605770378
irb(main):011:0> "test".object_id
=> -605779298
irb(main):012:0> "test".object_id
=> -605784948
3引用字符串「test」,所有不同的對象。
這意味着使用符號可能會根據應用程序潛在地節省很多內存。因爲它們是相同的對象,因此比較符號的等同性也更快,因爲比較相同的字符串要慢得多,因爲字符串值需要比較而不僅僅是對象ID。
至於何時使用哪個,我通常使用字符串幾乎除了哈希鍵之類的東西,我真的想要一個唯一的標識符,而不是一個字符串。
符號是用來表示名稱和字符串的東西。如果您可能需要多次使用字符串,您會希望使用符號,因爲這樣更容易,更高效。
而且剛剛發現這個通過谷歌,它可以提供更詳細:Here you go
符號和字符串是完全不同的this post有一個小洞察的差異。至於何時何地使用它們,在has many :through上有相當廣泛的帖子。
作爲對比,我的一位朋友最近寫了a post titled "Ruby Rant",它給出了Ruby符號的另一個看法。 String
和Symbol
之間
另外一個區別是,String
上有字符串處理更大量的方法,而Symbol
是一個相對稀對象。
查看String
class和Symbol
class的文檔。
字符串是可變的,符號皆爲不變
注:可變對象可分配之後,而不可變對象只能 覆蓋 http://www.robertsosinski.com/2009/01/11/the-difference-between-ruby-symbols-and-strings/
符號是不可改變和字符串是可變的改變。
當我們對字符串執行任何操作時,它會創建一個新對象並採取修補。因爲我們對字符串意味着越來越多的操作,所以我們消耗的內存越來越多。
符號是不可改變的對象,如果我們執行任何操作,那麼它執行原始對象的更改,它不會創建任何對象,這就是爲什麼它更有利可圖。
獲取更多信息,您可以click here
符號的定義&字符串之間的區別是什麼?
- 符號是不可變的:它們的值保持不變。
- 相同符號的多個用途具有相同的對象ID,並且與字符串相比是相同的對象,每次都是具有唯一對象ID的不同對象。
- 您無法調用像符號上的#upcase,#split這樣的任何字符串方法。
從Understanding Differences Between Symbols & Strings in Ruby
如果你是中國人,你也可以閱讀理解 Ruby Symbol
有字符串和符號在紅寶石之間的兩個主要區別。
字符串是可變的,符號不是
因爲字符串是可變的,它可以在某個地方的變化,並可能導致的結果是不正確的。
符號是不可變的。
字符串是一個對象,因此需要的內存分配
提出 「ABC」 .object_id#70322858612020
看跌期權 「ABC」 .object_id#70322846847380
看跌期權 「ABC」。 object_id#70322846815460
另一方面,Symbol會爲你e相同的對象:
puts :abc.object_id # 1147868
puts :abc.object_id # 1147868
puts :abc.object_id # 1147868
所以字符串將需要更多的時間來使用和比符號。
你可以閱讀更多here充分理解:
聲明
foo = "bar"
在內存中創建一個新的對象。如果我們重複聲明
foo = "bar"
我們創建另一個對象
讓它更清楚,請嘗試紅寶石控制檯下面的代碼
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
你會得到輸出像
string bar with object id = 70358547221180
string bar with object id = 70358548927060
其清楚地顯示存在用於相同的字符串兩個不同的對象。現在,如果你使用的符號,將每個符號創建一個對象,以便
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
顯示
symbol bar with object id = 7523228
symbol bar with object id = 7523228
,這意味着只有一個對象爲:酒吧
進一步的符號是不變並且您無法調用符號上的任何字符串方法(如#upcase, #split
)。
比較符號是不是比較字符串快。
符號可以認爲形成一組唯一的被有效地轉換成存儲器指針在堆上作爲常數/不可變的串。這意味着在比較兩個符號是快的,因爲你只是比較兩個整數(內存指針。)
字符串是可變的,所以內存指針,其價值在堆中可以修改後更改。這意味着比較操作比較慢,因爲可以存在語義上相同的重複項。
用途
使用Symbol
當你確信該值將保持不變。示例使用散列鍵符號, 當您想要更改值或想要使用字符串方法時使用字符串。
- 1. Ruby中的字符串和符號有什麼區別?
- 2. C字符串和C++字符串有什麼區別?
- 3. 字符串和字符串有什麼區別?
- 4. Ruby字符串掃描和匹配有什麼區別
- 5. nohup和&符號有什麼區別
- 6. 「interned」和「uninterned」符號有什麼區別
- 7. 零售符號和選中符號有什麼區別?
- 8. 兩個字符串有什麼區別?
- 9. 在C#中的區別是什麼:字符串VS字符串
- 10. 查找Ruby中字符串的區別
- 11. 正常字符串和'%s'格式的字符串有什麼區別?
- 12. Ruby:空字符串和空字符串有什麼不同?
- 13. C中的字符串和ASCII字符串有區別嗎?
- 14. %和,在一個字符串中有什麼區別?
- 15. Python字符串格式化中%s和%d有什麼區別?
- 16. 打印和格式化字符串文字有什麼區別?
- 17. 在Android OS或Java中,字符序列和字符串有什麼區別?
- 18. 分配和創建實例的字符串有什麼區別?
- 19. 當使用Ruby分割字符串時,/ \ t + |,/和/ [\ t +,] /有什麼區別?
- 20. LISP中的變量和符號有什麼區別?
- 21. Common Lisp中的原子和符號有什麼區別?
- 22. 字符和字符編碼有什麼區別
- 23. 初始化字符串時'...'和「...」有什麼區別?
- 24. Response.WriteAsync和返回字符串有什麼區別
- 25. qs和查詢字符串有什麼區別
- 26. ActionScript中單引號和雙引號字符串的區別
- 27. C#中的字符串和字符串之間有什麼區別像Java中的int和Integer嗎?
- 28. 在字符串中使用回車符和\ r \ n有什麼區別
- 29. PHP數組中的這兩個字符串有什麼區別?
- 30. 在C中創建字符串的方法有什麼區別?
雖然符號不被垃圾收集清理,堅持圍繞直到運行實例的結尾。所以如果你聲明瞭很多符號,你可能會浪費大量的內存。 – Daemin 2008-10-31 22:17:01
@Daemin:除非您動態創建符號,否則這通常不是問題。這是一些應用程序內存膨脹的原因。如果您在代碼中使用硬編碼的符號,則相對安全。 – Pistos 2008-10-31 23:45:05