可能性のある複製:
Scalaのシンボルリテラルの使用例の例
Symbolの目的は何ですか。なぜ特別なliteral構文に値するのでしょうか。 g。 'FooSymbol
?
シンボルは、すぐに比較できるようにする識別子の閉じたセットがある場合に使用されます。 String
インスタンスが2つある場合、インターンが保証されない[1]ため、それらを比較するには、長さを比較し、同じかどうかを文字ごとにチェックすることによって、内容を頻繁にチェックする必要があります。 Symbol
インスタンスの場合、比較は単純なeq
チェック(つまり、Javaの_==
_)であるため、一定の時間です(つまり、検索するO(1))。
この種の構造は、動的言語(特にRubyおよびLISPコードはシンボルを多く使用する傾向があります)で使用される傾向があります。静的に型付けされた言語では通常、セットを制限するためタイプ別のアイテム。
とはいえ、静的な型付きオブジェクトを使用するのが面倒になるキーの制限されたセットがあるキー/値ストアがある場合、_Map[Symbol, Data]
_- style構造が適切かもしれません。
Java(したがってScala)でのString
インターンに関する注意:Java String
sはとにかくインターンされます;特定の文字列リテラルは自動的にインターンされ、インターンされたコピーを返すためにString
インスタンスでintern()
メソッドを呼び出すことができます。ただし、すべてのString
sがインターンされるわけではありません。同じインスタンスであり、インターンは2つの等しいインターンされた文字列の比較を高速化しますが、異なる文字列を比較する実行時間を改善しません。Symbol
sは、guaranteed抑留されているため、この場合、単一の参照等価チェックは、等価または不等価を証明するのに十分です。
[1]インターンは、オブジェクトを作成するときに、同じオブジェクトが既に存在するかどうかを確認し、存在する場合はそのオブジェクトを使用するプロセスです。つまり、等しい2つのオブジェクトがある場合、それらはまったく同じオブジェクトです(つまり、参照が等しい)。これの欠点は、使用する必要のあるオブジェクトを検索するのにコストがかかり、オブジェクトをガベージコレクションできるようにするには複雑な実装が必要になる可能性があることです。
Symbol
sはインターンされます。
目的は、Symbol
がString
sよりも効率的であり、同じ名前のSymbol
sが同じSymbol
オブジェクトを参照することです(そのため、同じハッシュコードを持ちます)。 。
Rubyシンボル: http://glu.ttono.us/articles/2005/08/19/understanding-Ruby-symbols
Symbol
の名前のみを取得できます:
scala> val aSymbol = 'thisIsASymbol
aSymbol: Symbol = 'thisIsASymbol
scala> assert("thisIsASymbol" == aSymbol.name)
Scalaではあまり役に立たないため、あまり使用されていません。一般的に、識別子を指定したい場所でシンボルを使用できます。
たとえば、2.8.0で予定されていたリフレクション呼び出し機能は、構文obj o 'method(arg1, arg2)
を使用しました。'o 'はAnyに追加されたメソッドで、Symbolが追加されたメソッドapply(Any *)(両方とも' pimp私のライブラリ」)。
別の例として、HTMLドキュメントを作成する簡単な方法を作成する場合、「div」を使用して「div」と記述する要素を指定する必要があります。次に、要素を作成するための構文糖を作成するためにSymbolに演算子を追加することを想像できます。