95

シンボル リテラルの使用は、私が Scala について調べた限りではすぐにはわかりません。誰かが実際の使用法を共有したいと思いますか?

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

「HelloWorld」と「HelloWorld」を使用する動機は何ですか?

ありがとう

4

4 に答える 4

78

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

シンボルを使用する他の言語は、Lisp ( 'abcdScala のように使用)、Ruby ( :abcd)、Erlang、および Prolog ( abcd; これらはシンボルではなくアトムと呼ばれます) です。

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

于 2009-04-23T07:58:06.173 に答える
26

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

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

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

于 2009-04-23T06:19:22.260 に答える
2

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

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

于 2015-11-23T13:45:08.710 に答える