2017-04-07 68 views
0

我想了解在Ruby中做什麼符號的程度。我知道使用符號作爲鍵而不是字符串的速度更快,效率更高,但速度如何?爲什麼將方法創建爲符號很重要?

從我的理解,參考方法時,它必須表示爲符號:to_i而不是to_i。這樣做的目的是什麼?

+0

'引用方法時,它必須表示爲符號。 (即:to_i而不是.to_i)這個的目的是什麼?''你的意思是什麼像array.map(&:to_i)? – idej

+0

歡迎來到Stack Overflow。你想知道什麼符號和它們是如何工作的,或者你想知道爲什麼我們在傳遞方法名稱時使用符號?這些問題不相關,並導致一個廣泛的問題。請閱讀「[問]」和鏈接的頁面。 –

+1

它是其他符號問題的重複。只是嘗試使用搜索 – idej

回答

8

在Ruby中,一個符號僅僅是一個不可改變的字符串:

"hello " + "world" #=> "hello world" 
:hello_ + :world #=> NoMethodError: undefined method `+' for :hello:Symbol 

不可變使得符號的安全和可靠的參考,例如:

Object.methods => [:new, :allocate, :superclass, #etc..] 

如果紅寶石是在這裏使用的字符串,用戶將能夠修改字符串,從而毀壞將來的電話Object.methods。這可以通過在每次調用方法時創建字符串副本來解決,但這會佔用大量內存。

事實上,因爲紅寶石知道符號永遠不會被修改,這樣可以節省每個符號只有一次,無論多少次,你把它聲明:

"hello".object_id #=> 9504940 
"hello".object_id #=> 9565300 

:hello.object_id #=> 1167708 
:hello.object_id #=> 1167708 

這需要符號的節省內存的潛力甚至更進一步,允許您在任何地方和任何地方在代碼中使用符號文字,而只需很少的內存開銷。

因此,對您的問題的回合答案:符號不能被修改,但它們更安全,更有效;因此,只要你有一個你認爲不應該修改的字符串,就應該使用它們。

符號被用作鍵哈希因爲:

  1. 你不應該修改散列的關鍵,而它的哈希值。
  2. 散列需要很多字面引用,例如my_hash[:test],所以它使用符號更具有內存效率。

至於方法參考:你不能直接引用一個方法,即send(my_method()),因爲不能區分傳遞方法和執行方法。字符串可以在這裏使用,但由於方法的名字一旦定義就不會改變,因此將名稱表示爲符號更有意義。