符号就像字符串,但它们是不可变的,不能修改.
它们只被放入内存一次,这使得它们非常有效地用于哈希中的键之类的事情,但它们会一直留在内存中,直到程序退出.如果你误用它们,这会让它们成为一个记忆猪.
如果动态创建大量符号,则会分配大量在程序结束前无法释放的内存.如果你知道你会:
正如我之前所说的,它们对于散列之类的事情很有用——在散列中,你更关心变量的identity,而不是它的值.正确使用符号是传递身份的一种可读且有效的方式.
在你的 comments 中,我将解释我关于符号不变性的意思.
字符串就像数组;它们可以就地修改:
12:17:44 ~$ irb
irb(main):001:0> string = "Hello World!"
=> "Hello World!"
irb(main):002:0> string[5] = 'z'
=> "z"
irb(main):003:0> string
=> "HellozWorld!"
irb(main):004:0>
符号更像是数字;它们不能就地编辑:
irb(main):011:0> symbol = :Hello_World
=> :Hello_World
irb(main):012:0> symbol[5] = 'z'
NoMethodError: undefined method `[]=' for :Hello_World:Symbol
from (irb):12
from :0