符號 Symbol
符號(Symbol)用來表達整個程式裡面唯一的識別名稱。
符號會在編譯時期被識別,並且我們無法動態地建立符號。
唯一建立符號的方式即為使用符號常值,以冒號(:
)開頭,後方接著識別名稱。
識別名稱也可以用雙引號("
)括起。
:unquoted_symbol
:"quoted symbol"
:"a" # identical to :a
被雙引號括起來的識別名稱內可以包含所有的萬國碼字元以及與字串常值相同規則的跳脫字元,當然,是沒有辦法插值的。
對於未被括起的識別名稱,其規則則與方法命名規則一樣。可以包含所有字母、數字、底線以及所有字碼大於 159
(0x9F
)的所有字元。
但無法以數字作為開頭,並且與方法一樣,可以使用驚歎號(!
)或問號(?
)作為結尾。
:question?
:exclamation!
所有在 Crystal 的運算子也都可以使用符號來表達:
:+
:-
:*
:/
:%
:&
:|
:^
:**
:>>
:<<
:==
:!=
:<
:<=
:>
:>=
:<=>
:===
:[]
:[]?
:[]=
:!
:~
:!~
:=~
內部實作時,會將符號視為一種 Int32
,並賦予其唯一的常數值。
百分比符號陣列常值表示法
除了單一符號常值以外,我們也可以透過百分比(%
)常值表示法來建立符號陣列。
使用 %i
來描述符號陣列,並使用成對的小括號(()
)、中括號([]
)、大括號({}
)、角括號(<>
)或是垂直條(||
)。
除了垂直條,其他的括號都可以在常值中成對使用而不會關閉表達式。
%i(foo bar baz) # => [:foo, :bar, :baz]
%i(foo\nbar baz) # => [:"foo\nbar", :baz]
%i(foo(bar) baz) # => [:"foo(bar)", :baz]
由於符號識別名稱可以包含任意萬國碼字元,在識別名稱的空白(
)則需要使用跳脫字元來表達。
%i(foo\ bar baz) # => [:"foo bar", :baz]