对于学习 Ruby 的人来说,不太理解符号是很常见的。符号是标准的 Ruby 类型,就像其他内置的 Ruby 类型一样。下面是一个符号如何只是特定类型的对象的示例:
'A'.class # => String
1.class # => Fixnum
:a.class # => Symbol
与任何其他类型一样,符号也有方法。如果您打开 IRB 并输入 :a.methods.sort,它将显示您可以在符号上调用的所有方法。例如,:a.to_s # => 'a'
如您所见,符号通常用作Hash 键。不过其他类型也可以是Hash键:
my_hash = { 'A' => 'an A', 1 => 'a 1', :a => 'the symbol a'}
my_hash['A'] # => 'an A'
my_hash[1] # => 'a 1'
my_hash[:a] # => 'the symbol a'
就像您可以将String 或其他类型传递给方法一样,您也可以传递Symbol。实际上,在最后一个示例中,我们传递了一个String、一个Fixnum,然后是一个Symbol 到my_hash 的[] 方法。
人们真正喜欢哈希键符号的原因是它们非常轻量级,易于重用。下面是一个示例,展示了符号和任何其他对象之间的主要区别之一:
"a".object_id # => 70098399407740
"a".object_id # => 70098399393460
"a".object_id # => 70098399388140
:a.object_id # => 359368
:a.object_id # => 359368
:a.object_id # => 359368
如您所见,我创建了三个值为“a”的字符串,它们每个都有不同的对象 ID。换句话说,内存中有三个String 对象包含值“a”。相反,每次我使用:a 时,它都有相同的对象ID。我的整个程序中只有一个:a 对象。
将符号传递给方法并不少见。你会在 Rails 中看到很多。