我试图了解符号在Ruby中的作用范围。我知道使用符号作为键比使用字符串更快、更有效,但它如何更快?
根据我的理解,在引用方法时,它必须表示为符号,:to_i
而不是to_i
。这样做的目的是什么?
在 Ruby 中,符号只是一个不可变的字符串:
"hello " + "world" #=> "hello world"
:hello_ + :world #=> NoMethodError: undefined method `+' for :hello:Symbol
不可变使符号成为安全可靠的参考,例如:
Object.methods => [:new, :allocate, :superclass, #etc..]
如果Ruby在这里使用字符串,用户将能够修改字符串,从而破坏Object.methods
的未来调用。可以通过在每次调用该方法时复制字符串来解决此问题,但这将是巨大的内存占用。
事实上,由于 Ruby 知道符号永远不会被修改,所以它只保存每个符号一次,无论你声明多少次:
"hello".object_id #=> 9504940
"hello".object_id #=> 9565300
:hello.object_id #=> 1167708
:hello.object_id #=> 1167708
这进一步发挥了符号的内存节省潜力,允许您随时随地在代码中使用符号文本,而内存开销很小。
所以,对你的问题的迂回回答:符号不能修改,但它们更安全,更节省内存;因此,只要你有一个你知道不应该被修改的字符串,你应该使用它们。
符号用作哈希的键,因为:
- 切勿在哈希中修改哈希的键。
- 哈希需要大量的文字引用,即
my_hash[:test]
,因此使用符号更节省内存。
至于方法引用:你不能直接引用一个方法,即send(my_method())
因为无法区分传入和执行方法。此处可以使用字符串,但由于方法的名称在定义后永远不会更改,因此将名称表示为符号更有意义。