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

Why is it important to create a method as a symbol?

我想了解符号在 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())因为分不清传入方法和执行方法的区别。此处可以使用字符串,但由于方法名称一旦定义就永远不会更改,因此将名称表示为符号更有意义。