跳至内容

符号

一个 符号 代表整个源代码中的一个唯一名称。

符号在编译时被解释,不能动态创建。创建符号的唯一方法是使用符号字面量,由冒号 (:) 后跟标识符表示。标识符可以可选地用双引号 (") 括起来。

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