我试图理解红宝石中符号和变量之间的区别。在给出引用对象的名称时,它们似乎完全相同。
我已经读过这些符号可用于更快的程序,但我不确定它们为什么或如何以任何方式与变量不同。
答案 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)
他们非常不同。变量为对象提供标签。符号更像是字符串,除了它们在内存中不可变和内部,因此对同一符号的多次引用不会使用额外的内存。 (将此与字符串进行对比,其中对同一字符串的多次引用将导致字符串的多个副本。)