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


93

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

シンボルリテラルでカバーされている特定のJavaイディオムはありますか?どの言語に似た構成がありますか?私はPythonの出身ですが、その言語に類似するものがあるかどうかはわかりません。

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

ありがとう

回答:


76

Java用語では、シンボルはインターンされた文字列です。つまり、たとえば、参照の等価比較(eqScalaと==Java)は、通常の等価比較(==ScalaとequalsJava)と同じ結果に'abcd eq 'abcdなります。trueを返しますが、"abcd" eq "abcd"JVMの気まぐれによっては(true リテラル用ですが、一般的に動的に作成される文字列用ではありません)。

シンボルを使用する他の言語には、Lisp('abcdScalaのように使用)、Ruby(:abcd)、Erlang、Prolog(abcd;シンボルの代わりにアトムと呼ばれます)があります。

文字列の構造を気にせず、純粋に何かの名前として使用する場合は、シンボルを使用します。たとえば、CDを表すデータベーステーブルがあり、 "price"という名前の列が含まれている場合、 "price"の2番目の文字が "r"であることや、列名の連結については気にしません。そのため、Scalaのデータベースライブラリは、テーブル名と列名に記号を適切に使用できます。


25
Scalaの==が.equalsを実行することを覚えておく価値はあるでしょう。そのため、実際には、等しい参照を行う "eq"メソッドを使用する場合とは異なります。ただし、ボーナスの1つは、シンボル間の比較が非常に安価であることです。
Calum

@ Calum、2つの文字列の比較。Javaインターン(多かれ少なかれ)すべての文字列。
Elazar Leibovich 2010

4
@エラザール:それは本当ですか?Javaはリテラルだけをインターンする(つまり、些細な例ではほとんどすべての文字列であり、量産ソフトウェアではほとんど文字列がない)という印象を受けました。シンボルのユースケースは通常リテラル値として(通常、ゼロから作成することはないだろう)と述べたので、間違いなく、得られる主な利点は、より記述的なタイプにすぎません。
Calum 2010

1
@Elazarはそうではありません。シンボルはインターンされる値に依存できるためです。一方、文字列ではオプションであり、いくつかのユースケースを最適化できます。シンボルは、何よりも動的に作成されるEnumに似ています。私は前回の回答でリンクした回答についてこれについて詳しく説明しました。詳しくはこちらをご覧ください。
Calum

3
それで、「こんにちは、世界!」「のhelloWorldは人にやさしい値ではなく14392.ている間、文字のシーケンシャルコレクションです
CW Holeman IIは、

26

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

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

このリンクはそれをかなりよく議論します。


1
これは、avに役立つ説明です。enumの代替案について考えるようになります。これは
扱いにくい

2

Python は、すべての変数、関数、モジュールなどの名前を持つ「インターンされた文字列」の内部グローバルテーブルを保持します。このテーブルを使用すると、インタープリターはより高速な検索と最適化を行うことができます。intern関数を使用してこのプロセスを強制できます(sys.internpython3)。

また、JavaとScalaは、検索を高速化するために「インターン文字列」を自動的に使用します。scalaでは、internメソッドを使用して文字列のインターンを強制できますが、このプロセスはすべての文字列で機能するわけではありません。シンボルはインターンされることが保証されていることから利益を得ます。そのため、単一の参照等価チェックは、等価または不等価を証明するのに十分です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.