95

从我在 Scala 上读到的内容中,符号文字的使用并不是很清楚。有人愿意分享一些现实世界的用途吗?

符号文字是否涵盖了特定的 Java 习惯用法?哪些语言有类似的结构?我来自 Python 背景,不确定该语言中有什么类似的东西。

是什么促使我使用“HelloWorld”与“HelloWorld”?

谢谢

4

4 回答 4

78

在 Java 术语中,符号是内部字符串。这意味着,例如,引用相等比较(eq在 Scala 和Java 中)给出与正常相等比较(在 Scala 和Java 中)==相同的结果:将返回 true,而可能不会,这取决于 JVM 的突发奇想(嗯,它应该对于文字,但不适用于一般动态创建的字符串)。==equals'abcd eq 'abcd"abcd" eq "abcd"

其他使用符号的语言是 Lisp(使用'abcd类似 Scala)、Ruby ( :abcd)、Erlang 和 Prolog ( abcd;它们被称为原子而不是符号)。

当我不关心字符串的结构并将其纯粹用作某事物的名称时,我会使用符号。例如,如果我有一个表示 CD 的数据库表,其中包含一个名为“price”的列,我不在乎“price”中的第二个字符是“r”,或者关于连接列名;因此 Scala 中的数据库库可以合理地使用表名和列名的符号。

于 2009-04-23T07:58:06.173 回答
26

如果您在代码中有表示方法名称的纯字符串,可能会被传递,那么您并不能正确地传达信息。这有点像数据/代码边界问题,画线并不总是那么容易,但如果我们说在那个例子中这些方法名称是代码而不是数据,那么我们想要一些东西来清楚地识别.

符号文字开始发挥作用,它清楚地区分任何旧的字符串数据和代码中使用的构造。它就在你想指出的地方,这不仅仅是一些字符串数据,实际上是代码的一部分。像你的 IDE 这样的想法会以不同的方式突出它,并且给定工具,你可以重构这些,而不是进行文本搜索/替换。

这个链接很好地讨论了它。

于 2009-04-23T06:19:22.260 回答
4

注意:Symbols将被弃用,然后在 Scala 3 (dotty) 中被删除。

参考:http ://dotty.epfl.ch/docs/reference/dropped-features/symlits.html

因此,我个人建议不要再使用Symbols(至少在新的 scala 代码中)。正如 dotty 文档所述:

不再支持符号文字

建议使用纯字符串文字 [...]

于 2020-09-24T09:41:59.470 回答
2

Python 维护一个内部全局表,其中包含所有变量、函数、模块等的名称。有了这个表,解释器可以进行更快的搜索和优化。intern您可以使用函数(sys.intern在 python3 中)强制执行此过程。

此外,Java 和 Scala 自动使用“内部字符串”来加快搜索速度。使用 scala,您可以使用该intern方法强制字符串的实习生,但此过程不适用于所有字符串。符号受益于保证被实习,因此单个引用相等检查足以证明相等或不相等。

于 2015-11-23T13:45:08.710 回答