为什么将方法创建为符号很重要?

时间:2017-04-07 17:59:26

标签: ruby symbols

我试图理解Ruby中符号的作用程度。我知道使用符号作为键而不是字符串更快更有效,但它如何更快?

根据我的理解,在引用方法时,它必须表示为符号:to_i而不是to_i。这是什么目的?

1 个答案:

答案 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

这进一步降低了符号的内存节省潜力,允许您在代码中的任何地方使用符号文字,而内存开销很小。

因此,对您的问题的回答:符号无法修改,但它们更安全,内存效率更高;因此,只要你有一个你知道不应修改的字符串,就应该使用它们。

符号用作哈希的键,因为:

  1. 你不应该在哈希中修改哈希的密钥。
  2. 哈希需要大量的文字引用,即my_hash[:test],因此使用符号可以提高内存效率。
  3. 至于方法参考:你不能直接引用一个方法,即send(my_method()),因为它不能说明传递方法和执行方法之间的区别。字符串可以在这里使用,但由于方法的名称在定义后永远不会改变,因此将名称表示为符号更有意义。