【问题标题】:Why is it important to create a method as a symbol?为什么将方法创建为符号很重要?
【发布时间】:2017-09-03 05:03:16
【问题描述】:

我试图了解符号在 Ruby 中的作用范围。我知道使用符号作为键比使用字符串更快、更有效,但它如何更快呢?

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

【问题讨论】:

  • when referencing methods it has to be represented as a symbol. (i.e :to_i as opposed to .to_i) What is the purpose of this? - 你的意思是像 array.map(&:to_i) 这样的东西吗?
  • 欢迎来到 Stack Overflow。您想知道符号的作用以及它们是如何工作的,或者您想知道为什么我们在传递方法名称时使用符号?这些问题不相关,并导致一个广泛的问题。请阅读“How to Ask”和链接页面。
  • 这是其他关于符号的问题的重复。尝试使用搜索

标签: ruby symbols


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多