web-dev-qa-db-ja.com

Scalaのシンボルの目的は?

可能性のある複製:
Scalaのシンボルリテラルの使用例の例

Symbolの目的は何ですか。なぜ特別なliteral構文に値するのでしょうか。 g。 'FooSymbol

59
soc

シンボルは、すぐに比較できるようにする識別子の閉じたセットがある場合に使用されます。 Stringインスタンスが2つある場合、インターンが保証されない[1]ため、それらを比較するには、長さを比較し、同じかどうかを文字ごとにチェックすることによって、内容を頻繁にチェックする必要があります。 Symbolインスタンスの場合、比較は単純なeqチェック(つまり、Javaの_==_)であるため、一定の時間です(つまり、検索するO(1))。

この種の構造は、動的言語(特にRubyおよびLISPコードはシンボルを多く使用する傾向があります)で使用される傾向があります。静的に型付けされた言語では通常、セットを制限するためタイプ別のアイテム。

とはいえ、静的な型付きオブジェクトを使用するのが面倒になるキーの制限されたセットがあるキー/値ストアがある場合、_Map[Symbol, Data]_- style構造が適切かもしれません。

Java(したがってScala)でのStringインターンに関する注意:Java Stringsはとにかくインターンされます;特定の文字列リテラルは自動的にインターンされ、インターンされたコピーを返すためにStringインスタンスでintern()メソッドを呼び出すことができます。ただし、すべてのStringsがインターンされるわけではありません。同じインスタンスであり、インターンは2つの等しいインターンされた文字列の比較を高速化しますが、異なる文字列を比較する実行時間を改善しません。Symbolsは、guaranteed抑留されているため、この場合、単一の参照等価チェックは、等価または不等価を証明するのに十分です。

[1]インターンは、オブジェクトを作成するときに、同じオブジェクトが既に存在するかどうかを確認し、存在する場合はそのオブジェクトを使用するプロセスです。つまり、等しい2つのオブジェクトがある場合、それらはまったく同じオブジェクトです(つまり、参照が等しい)。これの欠点は、使用する必要のあるオブジェクトを検索するのにコストがかかり、オブジェクトをガベージコレクションできるようにするには複雑な実装が必要になる可能性があることです。

89
Calum

Symbolsはインターンされます。

目的は、SymbolStringsよりも効率的であり、同じ名前のSymbolsが同じ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)
7
michael.kebe

Scalaではあまり役に立たないため、あまり使用されていません。一般的に、識別子を指定したい場所でシンボルを使用できます。

たとえば、2.8.0で予定されていたリフレクション呼び出し機能は、構文obj o 'method(arg1, arg2)を使用しました。'o 'はAnyに追加されたメソッドで、Symbolが追加されたメソッドapply(Any *)(両方とも' pimp私のライブラリ」)。

別の例として、HTMLドキュメントを作成する簡単な方法を作成する場合、「div」を使用して「div」と記述する要素を指定する必要があります。次に、要素を作成するための構文糖を作成するためにSymbolに演算子を追加することを想像できます。

5
IttayD