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



我试图了解符号在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

这进一步发挥了符号的内存节省潜力,允许您随时随地在代码中使用符号文本,而内存开销很小。

所以,对你的问题的迂回回答:符号不能修改,但它们更安全,更节省内存;因此,只要你有一个你知道不应该被修改的字符串,你应该使用它们。

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

  1. 切勿在哈希中修改哈希的键。
  2. 哈希需要大量的文字引用,即my_hash[:test],因此使用符号更节省内存。

至于方法引用:你不能直接引用一个方法,即send(my_method())因为无法区分传入和执行方法。此处可以使用字符串,但由于方法的名称在定义后永远不会更改,因此将名称表示为符号更有意义。

最新更新