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

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

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

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

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 

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

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

 a = 'foo' b = :bar 

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

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

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

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