シンボル リテラルの使用は、私が Scala について調べた限りではすぐにはわかりません。誰かが実際の使用法を共有したいと思いますか?
シンボル リテラルでカバーされている特定の Java イディオムはありますか? 似た構造を持つ言語は? 私は Python のバックグラウンドを持っていますが、その言語に類似したものがあるかどうかはわかりません。
「HelloWorld」と「HelloWorld」を使用する動機は何ですか?
ありがとう
Java 用語では、シンボルはインターンされた文字列です。これは、たとえば、参照等価比較 ( eq
Scala およびJava) が通常の等価比較 ( Scala およびJava)==
と同じ結果を返すことを意味します。true を返しますが、JVM の気まぐれに応じて (まあ、そうすべきです)リテラル用ですが、一般に動的に作成された文字列用ではありません)。==
equals
'abcd eq 'abcd
"abcd" eq "abcd"
シンボルを使用する他の言語は、Lisp ( 'abcd
Scala のように使用)、Ruby ( :abcd
)、Erlang、および Prolog ( abcd
; これらはシンボルではなくアトムと呼ばれます) です。
文字列の構造を気にせず、純粋に何かの名前として使用する場合は、シンボルを使用します。たとえば、"price" という名前の列を含む CD を表すデータベース テーブルがある場合、"price" の 2 番目の文字が "r" であることや、列名を連結することは気にしません。そのため、Scala のデータベース ライブラリでは、テーブル名と列名に記号を合理的に使用できます。
コード内のsayメソッド名を表すプレーンな文字列があり、それがおそらく渡される場合は、物事を適切に伝えていません。これは一種のデータ/コード境界の問題であり、線を引くのは必ずしも簡単ではありませんが、その例でこれらのメソッド名がデータよりもコードであると言えば、それを明確に識別するものが必要です。 。
シンボルリテラルは、コードで使用されている構造を使用して古い文字列データを明確に区別する場合に役立ちます。これは、実際に示したい場所にあります。これは、文字列データだけでなく、実際にはコードの一部です。IDEのようなものであるという考えは、それを異なって強調し、ツールがあれば、テキスト検索/置換を行うのではなく、それらをリファクタリングすることができます。
このリンクはそれをかなりよく議論しています。
Pythonは、すべての変数、関数、モジュールなどの名前を含む「インターンされた文字列」の内部グローバル テーブルを維持します。このテーブルを使用すると、インタープリターはより高速な検索と最適化を行うことができます。intern
関数 ( sys.intern
python3 内)を使用して、このプロセスを強制できます。
また、Java と Scala は自動的に「インターンされた文字列」を使用して検索を高速化します。scala では、メソッドを使用しintern
て文字列のインターンを強制できますが、このプロセスはすべての文字列で機能するわけではありません。シンボルはインターンされることが保証されているという利点があるため、単一の参照等価チェックで、等価または不等価を証明するのに十分です。