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

Ruby 为什么将方法创建为符号很重要?,ruby,symbols,Ruby,Symbols,我试图理解符号在Ruby中的作用。我知道使用符号作为键比使用字符串快得多,效率也高得多,但它是如何更快的呢 根据我的理解,当引用方法时,它必须表示为一个符号:to_i,而不是_i。这样做的目的是什么?在Ruby中,符号只是一个不可变的字符串: "hello " + "world" #=> "hello world" :hello_ + :world #=> NoMethodError: undefined method `+' for :hello:Symbol 不可变使符号成为安

我试图理解符号在Ruby中的作用。我知道使用符号作为键比使用字符串快得多,效率也高得多,但它是如何更快的呢


根据我的理解,当引用方法时,它必须表示为一个符号:to_i,而不是_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],因此使用符号更节省内存。
至于方法引用:你不能直接引用一个方法,比如sendmy_方法,因为你不能区分传入方法和执行方法的区别。此处可以使用字符串,但由于方法的名称在定义后不会更改,因此将名称表示为符号更有意义。

引用方法时,必须将其表示为符号。i、 e:to_i而不是。to_i这是为了什么你的意思是像array.map&:to_i这样的东西吗?欢迎使用堆栈溢出。您想知道符号的作用和工作方式,还是想知道在传递方法名时为什么使用符号?这些问题并不相关,而是导致了一个广泛的问题。请阅读和链接页面。这是关于符号的其他问题的副本。试着使用搜索