我剛剛開始使用Ruby,並且正在閱讀「Programming Ruby 1.9 - Pragmatic Programmer's Guide」。我遇到了一些稱爲符號的東西,但作爲一名PHP開發人員,我不明白他們做了什麼以及他們的優點。Ruby and:symbols
任何人都可以幫我解決這個問題嗎?
我剛剛開始使用Ruby,並且正在閱讀「Programming Ruby 1.9 - Pragmatic Programmer's Guide」。我遇到了一些稱爲符號的東西,但作爲一名PHP開發人員,我不明白他們做了什麼以及他們的優點。Ruby and:symbols
任何人都可以幫我解決這個問題嗎?
來講想到的符號是非常有用「之稱的東西。」換句話說,香蕉就是指「香蕉這個東西」。它們廣泛用於Ruby,主要用作Hash(關聯數組)鍵。
他們真的很像字符串,但在幕後,非常不同。一個關鍵的區別是內存中只存在一個特定的符號。因此,如果您在代碼中提及香蕉10次,則只會創建一個香蕉實例,它們都會引用該實例。這也意味着它們是不可變的。
一個符號看作一個可以:
例如枚舉的方法名稱:
s = "FooBar"
length = s.send(:length)
>>> 6
符號是類似到字符串文字的意義上共享相同的內存空間,但重要的是要注意他們是而不是字符串等效。
在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"
符號與字符串不相似。 sym =:某事; sym.size給出錯誤。最好把一個符號想象成一個唯一的id(一個整數),它可以被一個字符串常量引用。 – Alkaline 2010-08-25 01:50:11
@Alkaline:Yeap,這就是爲什麼我強調*類似*而不是*等價*或其他詞。按照你的例子,它們不應該被認爲是':hola +:adios'也可以給出一個錯誤;)。我猜想需要一個不同的詞。 – OscarRyz 2010-08-25 02:28:43
很對:-)雖然可以將符號轉換爲整數Symbol.to_i,但不能進行符號運算。但是,您也可以將符號轉換爲字符串(Symbol.to_s)。符號是真正唯一的對象,它們的作用類似於散列鍵,參數名稱等的唯一ID。 – Alkaline 2010-08-25 02:33:04
@AboutRuby有一個很好的答案,使用術語「所謂的東西」。
:香蕉指的是「東西 叫香蕉」。
他指出,你可以參考:香蕉多次在代碼和它的同一個對象 - 即使在不同的範圍或關閉在一些奇怪的庫。 :香蕉就是所謂的香蕉,無論這可能意味着什麼時候使用它。
它們被用作
除了人們已經給出了答案,這裏有一些鏈接到一些好的博客文章,幫助解釋符號: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
這本質上是[什麼意思:這意味着在Ruby on Rails中?]的副本(http://stackoverflow.com/questions/2804798/what-does-this-means-in-ruby-on-rails ) – 2010-08-24 23:23:06