2010-08-24 25 views
2

我剛剛開始使用Ruby,並且正在閱讀「Programming Ruby 1.9 - Pragmatic Programmer's Guide」。我遇到了一些稱爲符號的東西,但作爲一名PHP開發人員,我不明白他們做了什麼以及他們的優點。Ruby and:symbols

任何人都可以幫我解決這個問題嗎?

+2

除了人們已經給出了答案,這裏有一些鏈接到一些好的博客文章,幫助解釋符號:http://onestepback.org/index.cgi/Tech/Ruby/SymbolsAreNotImmutableStrings.red HTTP:/ /glu.ttono.us/articles/2005/08/19/understanding-ruby-symbols http://www.randomhacks.net/articles/2007/01/20/13-ways-of-looking-at-a- ruby-symbol – mikej 2010-08-24 22:20:47

+1

這本質上是[什麼意思:這意味着在Ruby on Rails中?]的副本(http://stackoverflow.com/questions/2804798/what-does-this-means-in-ruby-on-rails ) – 2010-08-24 23:23:06

回答

5

來講想到的符號是非常有用「之稱的東西。」換句話說,香蕉就是指「香蕉這個東西」。它們廣泛用於Ruby,主要用作Hash(關聯數組)鍵。

他們真的很像字符串,但在幕後,非常不同。一個關鍵的區別是內存中只存在一個特定的符號。因此,如果您在代碼中提及香蕉10次,則只會創建一個香蕉實例,它們都會引用該實例。這也意味着它們是不可變的。

0

一個符號看作一個可以:

  • ,你打算使用後
  • 恆定/要存儲和比較反對

例如枚舉的方法名稱:

s = "FooBar" 
length = s.send(:length) 
>>> 6 
+0

請記住's.send(「length」)產生相同的結果。 – OscarRyz 2010-08-24 21:58:33

+0

@OscarRyz這是真的,符號和字符串之間的區別多年來一直高度稀釋 - 我只是想給符號更「哲學」的含義 – 2010-08-24 23:26:44

+0

它不如「哲學」,而是「傳統」 。也就是說,約定是它們經常在需要引用方法名稱的位置以及作爲哈希鍵的位置。 – Chubas 2010-08-25 03:13:27

3

符號是類似到字符串文字的意義上共享相同的內存空間,但重要的是要注意他們是而不是字符串等效。

在Ruby中,當您鍵入"this""this"時,您正在使用兩個不同的內存位置;通過使用符號,您將在程序執行過程中只使用一個名稱。所以如果你在你的程序的幾個地方輸入:this,你將只使用一個。

Symbol DOC:

符號對象代表的名字和Ruby解釋器裏面的一些字符串。它們使用:name:"string"文字語法以及各種to_sym方法生成。無論該名稱的上下文或含義如何,在程序執行期間,將爲給定名稱或字符串創建相同的符號對象。因此,如果Fred在一個上下文中是常量,而另一箇中是方法,而第三個是類,則符號:Fred在所有三個上下文中將是相同的對象。

所以,你基本上使用它,你想把一個字符串作爲一個常量。

例如,將它與attr_accessor方法一起使用以定義屬性的getter/setter是非常常見的。

class Person 
    attr_accessor :name 
end 
p = Person.new 
p.name= "Oscar" 

但這會做同樣的:

class DontDoThis 
    attr_accessor("name") 
end 
ddt = DontDoThis.new 
ddt.name= "Dont do it" 
+0

符號與字符串不相似。 sym =:某事; sym.size給出錯誤。最好把一個符號想象成一個唯一的id(一個整數),它可以被一個字符串常量引用。 – Alkaline 2010-08-25 01:50:11

+0

@Alkaline:Yeap,這就是爲什麼我強調*類似*而不是*等價*或其他詞。按照你的例子,它們不應該被認爲是':hola +:adios'也可以給出一個錯誤;)。我猜想需要一個不同的詞。 – OscarRyz 2010-08-25 02:28:43

+0

很對:-)雖然可以將符號轉換爲整數Symbol.to_i,但不能進行符號運算。但是,您也可以將符號轉換爲字符串(Symbol.to_s)。符號是真正唯一的對象,它們的作用類似於散列鍵,參數名稱等的唯一ID。 – Alkaline 2010-08-25 02:33:04

0

@AboutRuby有一個很好的答案,使用術語「所謂的東西」。

:香蕉指的是「東西 叫香蕉」。

他指出,你可以參考:香蕉多次在代碼和它的同一個對象 - 即使在不同的範圍或關閉在一些奇怪的庫。 :香蕉就是所謂的香蕉,無論這可能意味着什麼時候使用它。

它們被用作

  • 鍵陣列,所以你一看,香蕉,你只能有一個條目。在大多數語言中,如果這些字符串是字符串,那麼存在多個字符串的風險,並且文本爲「banana」,並且沒有檢測到代碼,它們與method/proc名稱是相同的
  • 。大多數人都熟悉C如何將方法與括號中的方法區分開:my_method與my_method()。在Ruby中,因爲括號是可選的,所以這兩個都表示對該方法的調用。但是,符號可以方便地用作方法的替代品(儘管符號和方法之間確實沒有關係)。
  • 枚舉(和其他常量)。由於他們沒有改變,他們展示了來自其他語言的這些功能的許多屬性。