web-dev-qa-db-ja.com

Scalaでのシンボルリテラルの使用例は何ですか?

シンボルリテラルの使用は、私がScalaで読んだ内容からすぐにはわかりません。誰かが実際の用途を共有したいと思いますか?

特定のJavaイディオムがシンボルリテラルでカバーされていますか?どの言語に類似した構成がありますか?私はPythonバックグラウンドから来ており、類似のものがないかわかりませんその言語で。

「HelloWorld対 "HelloWorld"を使用する動機は何ですか?

ありがとう

91
Joe Holloway

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のデータベースライブラリでは、テーブル名と列名に記号を合理的に使用できます。

75
Alexey Romanov

コード内でsayメソッド名を表すプレーンな文字列があり、それが渡される可能性がある場合は、物事を適切に伝えていません。これは一種のデータ/コード境界の問題であり、線を引くのは必ずしも容易ではありませんが、その例でこれらのメソッド名がデータよりもコードであると言えば、それを明確に識別できるようにする必要があります。

シンボルリテラルが機能し、コードで使用されている構造を持つ古い文字列データだけを明確に区別します。これは実際に表示したい場所にあります。これは単なる文字列データではなく、実際にはコードの一部です。あなたのIDE=のようなものであるという考えは、それを異なって強調します、そしてツールがあれば、テキスト検索/置換を行うのではなく、それらをリファクタリングすることができます。

これは link でかなりよく議論されています。

25
Saem

Pythonは、すべての変数、関数、モジュールなどの名前を持つ"interned strings"の内部グローバルテーブルを保持します。このテーブルを使用すると、インタープリターはより高速な検索と最適化を行うことができます。 intern関数(sys.intern in python3)。

また、JavaおよびScalaは自動的に"interned strings"を使用して検索を高速化します。scalaでは、internメソッドを使用して文字列を強制的にインターンしますが、このプロセスはすべての文字列で機能するわけではありません。シンボルがインターンされることが保証されているという利点があるため、1つの参照等価チェックで、等価または不等価を証明できます。

2
ChemaCortes