2017-04-07 61 views
0

我想了解在Ruby中做什么符号的程度。我知道使用符号作为键而不是字符串的速度更快,效率更高,但速度如何?为什么将方法创建为符号很重要?

从我的理解,参考方法时,它必须表示为符号:to_i而不是to_i。这样做的目的是什么?

+0

'引用方法时,它必须表示为符号。 (即:to_i而不是.to_i)这个的目的是什么?''你的意思是什么像array.map(&:to_i)? – idej

+0

欢迎来到Stack Overflow。你想知道什么符号和它们是如何工作的,或者你想知道为什么我们在传递方法名称时使用符号?这些问题不相关,并导致一个广泛的问题。请阅读“[问]”和链接的页面。 –

+1

它是其他符号问题的重复。只是尝试使用搜索 – idej

回答

8

在Ruby中,一个符号仅仅是一个不可改变的字符串:

"hello " + "world" #=> "hello world" 
:hello_ + :world #=> NoMethodError: undefined method `+' for :hello:Symbol 

不可变使得符号的安全和可靠的参考,例如:

Object.methods => [:new, :allocate, :superclass, #etc..] 

如果红宝石是在这里使用的字符串,用户将能够修改字符串,从而毁坏将来的电话Object.methods。这可以通过在每次调用方法时创建字符串副本来解决,但这会占用大量内存。

事实上,因为红宝石知道符号永远不会被修改,这样可以节省每个符号只有一次,无论多少次,你把它声明:

"hello".object_id #=> 9504940 
"hello".object_id #=> 9565300 

:hello.object_id #=> 1167708 
:hello.object_id #=> 1167708 

这需要符号的节省内存的潜力甚至更进一步,允许您在任何地方和任何地方在代码中使用符号文字,而只需很少的内存开销。

因此,对您的问题的回合答案:符号不能被修改,但它们更安全,更有效;因此,只要你有一个你认为不应该修改的字符串,就应该使用它们。

符号被用作键哈希因为:

  1. 你不应该修改散列的关键,而它的哈希值。
  2. 散列需要很多字面引用,例如my_hash[:test],所以它使用符号更具有内存效率。

至于方法参考:你不能直接引用一个方法,即send(my_method()),因为不能区分传递方法和执行方法。字符串可以在这里使用,但由于方法的名字一旦定义就不会改变,因此将名称表示为符号更有意义。

相关问题