コンテンツにスキップ

シンボル (Symbol)

Symbolはソースコード全体でユニークな名前を表します。

シンボルはコンパイル時に解釈されるもので、動的に生成することはできません。シンボルを生成する唯一の方法はシンボルリテラルを使うことです。それは、コロン (:) のあとに識別子を続けて記述します。識別子の部分はダブルクォート (") で囲むこともできます。

:unquoted_symbol
:"quoted symbol"
:"a" # :a に等しい
:

ダブルクォートで囲まれた識別子は空白を含む任意のユニコード文字を含むことができて、文字列リテラルで利用できるものと同じエスケープシーケンスを受け付けますが、補間はできません。

ダブルクォートで囲まれていない識別子の場合は、メソッド名として受け入れられるものと同じ規則の名前が受け入れられます。つまり、アルファベットや数値、アンダースコア (_) 、もしくは 159(0x9F) より大きいコードポイントの文字をシンボルの識別子に利用できます。そして、数字から識別子をはじめることはできず、識別子の最後にエクストラメーションマーク (!) やクエスチョンマーク (?) を続けることができます。

:question?
:exclamation!

すべてのCrystal の演算子もシンボルのダブルクォートで囲われていない識別子として有効です。

:+
:-
:*
:/
:%
:&
:|
:^
:**
:>>
:<<
:==
:!=
:<
:<=
:>
:>=
:<=>
:===
:[]
:[]?
:[]=
:!
:~
:!~
:=~

内部的には、シンボルはInt32型の定数値として実装されています。

パーセントシンボル配列リテラル

1つのシンボルを表すリテラルの他に、シンボルの配列を表すパーセントリテラルがあります。それは%iと区切り文字の組によって記述します。有効な区切り文字は、括弧()、角括弧[]、ひげ括弧{}、三角括弧<>そしてパイプ文字||です。パイプ文字を除いて、すべての区切り文字はネストに応じて適切に処理されます。

%i(foo bar baz)  # => [:foo, :bar, :baz]
%i(foo\nbar baz) # => [:"foo\nbar", :baz]
%i(foo(bar) baz) # => [:"foo(bar)", :baz]

識別子には任意のユニコード文字を含むことができます。個々のシンボルは1つのスペース () で区切られていて、スペースを1つの部分に含めたい場合はエスケープが必要です。

%i(foo\ bar baz) # => [:"foo bar", :baz]