2008-10-31 75 views

回答

69

主要區別在於代表單個值的多個符號是相同的,而字符串則不然。例如:

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。

至於何時使用哪個,我通常使用字符串幾乎除了哈希鍵之類的東西,我真的想要一個唯一的標識符,而不是一個字符串。

+8

雖然符號不被垃圾收集清理,堅持圍繞直到運行實例的結尾。所以如果你聲明瞭很多符號,你可能會浪費大量的內存。 – Daemin 2008-10-31 22:17:01

+5

@Daemin:除非您動態創建符號,否則這通常不是問題。這是一些應用程序內存膨脹的原因。如果您在代碼中使用硬編碼的符號,則相對安全。 – Pistos 2008-10-31 23:45:05

1

符號是用來表示名稱和字符串的東西。如果您可能需要多次使用字符串,您會希望使用符號,因爲這樣更容易,更高效。

而且剛剛發現這個通過谷歌,它可以提供更詳細:Here you go

0

作爲對比,我的一位朋友最近寫了a post titled "Ruby Rant",它給出了Ruby符號的另一個看法。 StringSymbol之間

3

另外一個區別是,String上有字符串處理更大量的方法,而Symbol是一個相對稀對象。

查看String classSymbol class的文檔。

0

符號是不可改變和字符串是可變的改變。

當我們對字符串執行任何操作時,它會創建一個新對象並採取修補。因爲我們對字符串意味着越來越多的操作,所以我們消耗的內存越來越多。

符號是不可改變的對象,如果我們執行任何操作,那麼它執行原始對象的更改,它不會創建任何對象,這就是爲什麼它更有利可圖。

獲取更多信息,您可以click here

9

符號的定義&字符串之間的區別是什麼?

  1. 符號是不可變的:它們的值保持不變。
  2. 相同符號的多個用途具有相同的對象ID,並且與字符串相比是相同的對象,每次都是具有唯一對象ID的不同對象。
  3. 您無法調用像符號上的#upcase,#split這樣的任何字符串方法。

Understanding Differences Between Symbols & Strings in Ruby

如果你是中國人,你也可以閱讀理解 Ruby Symbol

0

有字符串和符號在紅寶石之間的兩個主要區別。

  1. 字符串是可變的,符號不是

    • 因爲字符串是可變的,它可以在某個地方的變化,並可能導致的結果是不正確的。

    • 符號是不可變的。

  2. 字符串是一個對象,因此需要的內存分配

    提出 「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充分理解:

2

聲明

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當你確信該值將保持不變。示例使用散列鍵符號, 當您想要更改值或想要使用字符串方法時使用字符串。

相關問題