符號是具名的識別碼,可以用來指向某個值。
符號是透過符號字面值建立的,也就是在名稱前面加上:字元,例如: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 找到。