Ruby中的符号和变量有什​​么区别?

时间:2014-07-24 20:13:33

标签: ruby-on-rails ruby variables symbols

我试图理解红宝石中符号和变量之间的区别。在给出引用对象的名称时,它们似乎完全相同。

我已经读过这些符号可用于更快的程序,但我不确定它们为什么或如何以任何方式与变量不同。

3 个答案:

答案 0 :(得分:13)

符号是一个“内化”字符串,它更像是一个常量而不是任何东西。典型的例子:

account_details = {
  :name => 'Bob',
  :age => 20
}

此处符号:name:age是哈希的键。不要将它们与变量混淆。 account_details是一个变量。

Ruby中的变量是某种对象的句柄,该对象可能是符号。

通常在使用字符串时使用符号会导致大量重复。请记住,字符串通常是不同的对象,其中不同的符号始终引用同一个对象,如果经常使用它们会使它们更有效。

比较

"string".object_id == "string".object_id
# => false

:string.object_id == :string.object_id
# => true

即使这两个字符串相同,它们也是独立的字符串对象。当用作哈希,方法参数和其他常见情况的键时,这些对象会很快混乱你的内存并进行大量复制,除非你不想使用相同的字符串实例。符号会自动为您执行此操作。

答案 1 :(得分:5)

变量包含对象的引用。例如,变量可以引用字符串和符号,如:

a = 'foo'
b = :bar

在Ruby字符串中是可变的,这意味着您可以更改它们:'foo' + 'bar'将提供连接字符串。您可以将符号视为不可变字符串,这意味着您无法更改符号::foo + :bar会给您一个错误。最重要的是,相同的符号包含对同一对象的引用:

a = :foo
b = :foo
a.object_id # => 538728
b.object_id # => 538728

这提高了哈希查找和其他操作的性能。

答案 2 :(得分:4)

他们非常不同。变量为对象提供标签。符号更像是字符串,除了它们在内存中不可变和内部,因此对同一符号的多次引用不会使用额外的内存。 (将此与字符串进行对比,其中对同一字符串的多次引用将导致字符串的多个副本。)