符號¶
符號代表整個原始碼中的一個獨特名稱。
符號在編譯時被解析,無法動態建立。建立符號的唯一方法是使用符號字面值,以冒號 (:
) 後接識別符號表示。識別符號可以選擇性地用雙引號 ("
) 括起來。
:unquoted_symbol
:"quoted symbol"
:"a" # identical to :a
:あ
雙引號括起來的識別符號可以包含任何 Unicode 字元,包括空白字元,並接受與字串字面值相同的跳脫序列,但沒有插值。
對於未加引號的識別符號,其命名規則與方法相同。它可以包含字母數字字元、底線 (_
) 或程式碼點大於 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]
識別符號可以包含任何 Unicode 字元。個別符號以單一空格字元分隔,必須跳脫才能將其用作識別符號的一部分。
%i(foo\ bar baz) # => [:"foo bar", :baz]