符号是具名标识符,可用于指代一个值。
符号通过符号字面量创建,方法是在名称前加上 : 字符,例如 :foo。
它们也可以用引号书写,例如 :"foo",这样名称中就可以包含空格等。
:foo # => :foo
:"foo boo" # => :"foo boo"
符号在该语言的许多地方都有使用,包括作为哈希的键,用来表示方法名和变量名。
符号与字符串的不同之处在于,它们是标识符,不表示数据或文本。 这意味着,同名的两个符号始终是同一个对象。
"foo".object_id # => 60
"foo".object_id # => 80
:foo.object_id # => 1086748
:foo.object_id # => 1086748
符号是不可变的,也就是说它们不能被修改。 这意味着,当你“修改”一个符号时,实际上是在创建一个新符号。 有几个方法可用于操作符号,它们都返回新符号。 所有方法都可以在 Symbol API 中找到。
:foo.upcase # => :FOO
:foo.object_id # => 1086748
:foo.upcase.object_id # => 60
符号不可变的好处是,它们比字符串更节省内存,而且作为标识符使用也更安全。
符号可以转换为字符串,反之亦然。
当你想修改一个符号,或者想把符号当作字符串使用时,这会很有用。
要把字符串表示为符号,可以使用 String#to_sym 方法;反过来,可以使用 Symbol#to_s 方法。
由于符号可用的方法有限,当需要新符号时,先把符号转换成字符串,再对其使用字符串方法,会很有用。
:foo.to_s # => "foo"
"foo".to_sym # => :foo
在 Ruby 中,可以使用各种方法获取作用域中的名称,以取得常量、方法和变量的名称。 这些方法返回符号数组。
一些方法是 Module#constants、Module#instance_methods、Module#class_variables、global_variables 和 local_variables。
module Foo
BAR = 1
def self.baz; end
end
a = 1
Foo.constants # => [:BAR]
Foo.instance_methods # => [:baz]
local_variables # => [:a]
所有方法都可以在 Kernel API 和 Module API 中找到。