我试图理解Ruby中符号的作用程度。我知道使用符号作为键而不是字符串更快更有效,但它如何更快?
根据我的理解,在引用方法时,它必须表示为符号:to_i
而不是to_i
。这是什么目的?
答案 0 :(得分:8)
在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())
,因为它不能说明传递方法和执行方法之间的区别。字符串可以在这里使用,但由于方法的名称在定义后永远不会改变,因此将名称表示为符号更有意义。