我试图理解Ruby中符号的作用程度.我知道使用符号作为键而不是字符串更快更有效,但它如何更快?
根据我的理解,在引用方法时,它必须表示为符号,:to_i而不是to_i.这样做的目的是什么?
在Ruby中,符号只是一个不可变的字符串:
"hello " + "world" #=> "hello world"
:hello_ + :world #=> NoMethodError: undefined method `+' for :hello:Symbol
Run Code Online (Sandbox Code Playgroud)
不可变是使符号成为安全可靠的参考,例如:
Object.methods => [:new, :allocate, :superclass, #etc..]
Run Code Online (Sandbox Code Playgroud)
如果Ruby在这里使用字符串,用户将能够修改字符串,从而破坏未来的调用Object.methods.这可以通过在每次调用方法时复制字符串来修复,但这将是一个巨大的内存占用.
实际上,由于Ruby知道符号永远不会被修改,因此无论您声明它多少次,它都只保存一次符号:
"hello".object_id #=> 9504940
"hello".object_id #=> 9565300
:hello.object_id #=> 1167708
:hello.object_id #=> 1167708
Run Code Online (Sandbox Code Playgroud)
这进一步消除了符号的内存节省潜力,允许您在代码中的任何地方使用符号文字,而内存开销很小.
所以,对你的问题的回答:符号不能修改,但它们更安全,更有效; 因此,只要您知道不应修改的字符串,就应该使用它们.
符号用作哈希的关键,因为:
my_hash[:test]使用符号的内存效率更高.至于方法引用:你不能直接引用一个方法,即send(my_method())因为无法区分传递方法和执行方法.这里可以使用字符串,但由于方法的名称在定义后永远不会更改,因此将名称表示为符号更有意义.
| 归档时间: |
|
| 查看次数: |
79 次 |
| 最近记录: |