符号在ruby中的作用是什么?字符串和符号有什么区别?

推荐答案

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

它们只被放入内存一次,这使得它们非常有效地用于哈希中的键之类的事情,但它们会一直留在内存中,直到程序退出.如果你误用它们,这会让它们成为一个记忆猪.

如果动态创建大量符号,则会分配大量在程序结束前无法释放的内存.如果你知道你会:

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

正如我之前所说的,它们对于散列之类的事情很有用——在散列中,你更关心变量的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

Ruby相关问答推荐

清理 jruby 中输入数据的编码错误

Ruby - 使用索引值识别和更新数组中的重复项

为什么数组中的 splat 如此昂贵?

Ruby 相当于 Groovy 的 Elvis (?:) 运算符?

Ruby 中有内置的二进制搜索吗?

如何在不使用 Ruby 保存到磁盘的情况下生成 zip 文件?

如何期望 RSpec should_receive 的一些(但不是全部)参数?

Ruby 中的发送方法

比较ruby中的两个字符串

扩展self 和module_function一样吗?

如何在 ruby​​ rake 中明确地失败任务?

无法对 ruby​​ 哈希使用点语法

如何在Ruby中获取给定月份的天数,占年份?

正则表达式,如何匹配多行?

你怎么说不等于在 Ruby 中?

Lisp 和 Erlang 原子、Ruby 和 Scheme 符号.它们有多大用处?

为什么 Ruby 文档中的方法前面有一个井号?

如何在 gemspec 中指定最低 Ruby 版本?

从 'mm/dd/yyyy' 格式解析 ruby​​ DateTime

Ruby:从 Ruby 中的变量创建哈希键和值