跳至內容

符號

符號代表整個原始碼中的一個獨特名稱。

符號在編譯時被解析,無法動態建立。建立符號的唯一方法是使用符號字面值,以冒號 (:) 後接識別符號表示。識別符號可以選擇性地用雙引號 (") 括起來。

: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]