符号¶
一个 符号 代表整个源代码中的一个唯一名称。
符号在编译时被解释,不能动态创建。创建符号的唯一方法是使用符号字面量,由冒号 (:
) 后跟标识符表示。标识符可以可选地用双引号 ("
) 括起来。
: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]