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