从我在 Scala 上读到的内容中,符号文字的使用并不是很清楚。有人愿意分享一些现实世界的用途吗?
符号文字是否涵盖了特定的 Java 习惯用法?哪些语言有类似的结构?我来自 Python 背景,不确定该语言中有什么类似的东西。
是什么促使我使用“HelloWorld”与“HelloWorld”?
谢谢
在 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 中的数据库库可以合理地使用表名和列名的符号。
如果您在代码中有表示方法名称的纯字符串,可能会被传递,那么您并不能正确地传达信息。这有点像数据/代码边界问题,画线并不总是那么容易,但如果我们说在那个例子中这些方法名称是代码而不是数据,那么我们想要一些东西来清楚地识别.
符号文字开始发挥作用,它清楚地区分任何旧的字符串数据和代码中使用的构造。它就在你想指出的地方,这不仅仅是一些字符串数据,实际上是代码的一部分。像你的 IDE 这样的想法会以不同的方式突出它,并且给定工具,你可以重构这些,而不是进行文本搜索/替换。
这个链接很好地讨论了它。
注意:Symbols
将被弃用,然后在 Scala 3 (dotty) 中被删除。
参考:http ://dotty.epfl.ch/docs/reference/dropped-features/symlits.html
因此,我个人建议不要再使用Symbols
(至少在新的 scala 代码中)。正如 dotty 文档所述:
不再支持符号文字
建议使用纯字符串文字 [...]
Python 维护一个内部全局表,其中包含所有变量、函数、模块等的名称。有了这个表,解释器可以进行更快的搜索和优化。intern
您可以使用函数(sys.intern
在 python3 中)强制执行此过程。
此外,Java 和 Scala 自动使用“内部字符串”来加快搜索速度。使用 scala,您可以使用该intern
方法强制字符串的实习生,但此过程不适用于所有字符串。符号受益于保证被实习,因此单个引用相等检查足以证明相等或不相等。