我想了解在Ruby中做什麼符號的程度。我知道使用符號作爲鍵而不是字符串的速度更快,效率更高,但速度如何?爲什麼將方法創建爲符號很重要?
從我的理解,參考方法時,它必須表示爲符號:to_i
而不是to_i
。這樣做的目的是什麼?
我想了解在Ruby中做什麼符號的程度。我知道使用符號作爲鍵而不是字符串的速度更快,效率更高,但速度如何?爲什麼將方法創建爲符號很重要?
從我的理解,參考方法時,它必須表示爲符號:to_i
而不是to_i
。這樣做的目的是什麼?
在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
這需要符號的節省內存的潛力甚至更進一步,允許您在任何地方和任何地方在代碼中使用符號文字,而只需很少的內存開銷。
因此,對您的問題的回合答案:符號不能被修改,但它們更安全,更有效;因此,只要你有一個你認爲不應該修改的字符串,就應該使用它們。
符號被用作鍵哈希因爲:
my_hash[:test]
,所以它使用符號更具有內存效率。至於方法參考:你不能直接引用一個方法,即send(my_method())
,因爲不能區分傳遞方法和執行方法。字符串可以在這裏使用,但由於方法的名字一旦定義就不會改變,因此將名稱表示爲符號更有意義。
'引用方法時,它必須表示爲符號。 (即:to_i而不是.to_i)這個的目的是什麼?''你的意思是什麼像array.map(&:to_i)? – idej
歡迎來到Stack Overflow。你想知道什麼符號和它們是如何工作的,或者你想知道爲什麼我們在傳遞方法名稱時使用符號?這些問題不相關,並導致一個廣泛的問題。請閱讀「[問]」和鏈接的頁面。 –
它是其他符號問題的重複。只是嘗試使用搜索 – idej