为什么在Ruby中动态创建大量符号并不好?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

ruby符号的功能是什么?字符串和符号有什么区别?为什么创建大量符号不好?

提问于
用户回答回答于

符号就像字符串,但它们是不可变的 - 它们不能被修改。

它们只被放入一次内存中,使得它们非常有效地用于诸如哈希键中的键,但是它们会留在内存中,直到程序退出。

如果动态创建大量符号,则会分配大量内存,直到程序结束才能释放内存。string.to_sym如果知道将:只应动态创建符号(使用):

  1. 需要重复访问符号
  2. 不需要修改它们

正如我前面所说的,它们对于哈希这样的东西很有用 - 在这里你更关心变量的身份而不是它的价值。正确使用时,符号是传递身份的可读和有效的方式。

我将解释我的意思是关于您的评论的符号的不可变性。

字符串就像数组; 他们可以在适当的地方修改:

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
用户回答回答于

无论使用何种符号,符号都是相同的对象和相同的内存分配:

>> :hello.object_id
=> 331068
>> a = :hello
=> :hello
>> a.object_id
=> 331068
>> b = :hello
=> :hello
>> b.object_id
=> 331068
>> a = "hello"
=> "hello"
>> a.object_id
=> 2149256980
>> b = "hello"
=> "hello"
>> b.object_id
=> 2149235120
>> b = "hell" + "o"

两个“相同”的字符串包含相同的字符,可能不会引用相同的内存,如果使用字符串进行散列,这可能效率低下。

所以,符号可以用于减少内存开销。但是,它们是内存泄漏源。

扫码关注云+社区