【发布时间】:2010-10-21 06:51:12
【问题描述】:
从我在 Scala 上读到的内容中,符号文字的使用并不是很清楚。有人愿意分享一些现实世界的用途吗?
符号文字是否涵盖了特定的 Java 习惯用法?哪些语言有类似的结构?我来自 Python 背景,不确定该语言中有什么类似的东西。
是什么促使我使用“HelloWorld”与“HelloWorld”?
谢谢
【问题讨论】:
从我在 Scala 上读到的内容中,符号文字的使用并不是很清楚。有人愿意分享一些现实世界的用途吗?
符号文字是否涵盖了特定的 Java 习惯用法?哪些语言有类似的结构?我来自 Python 背景,不确定该语言中有什么类似的东西。
是什么促使我使用“HelloWorld”与“HelloWorld”?
谢谢
【问题讨论】:
在 Java 术语中,符号是内部字符串。这意味着,例如,引用相等比较(Scala 中的 eq 和 Java 中的 ==)给出与普通相等比较(Scala 中的 == 和 Java 中的 equals)相同的结果:'abcd eq 'abcd 将返回是的,而 "abcd" eq "abcd" 可能不会,这取决于 JVM 的突发奇想(嗯,它应该用于文字,但不适用于一般动态创建的字符串)。
使用符号的其他语言是 Lisp(它使用 'abcd,如 Scala)、Ruby(:abcd)、Erlang 和 Prolog(abcd;它们被称为原子而不是符号)。
当我不关心字符串的结构并将其纯粹用作某事物的名称时,我会使用符号。例如,如果我有一个表示 CD 的数据库表,其中包含一个名为“price”的列,我不在乎“price”中的第二个字符是“r”,或者关于连接列名;因此 Scala 中的数据库库可以合理地使用符号来表示表名和列名。
【讨论】:
如果您在代码中有表示方法名称的纯字符串,这些字符串可能会被传递,那么您就没有完全正确地传达信息。这有点像数据/代码边界问题,画线并不总是那么容易,但如果我们说在那个例子中这些方法名称是代码而不是数据,那么我们想要一些东西来清楚地识别.
符号文字开始发挥作用,它清楚地区分任何旧字符串数据和代码中使用的构造。它就在你想指出的地方,这不仅仅是一些字符串数据,实际上是代码的一部分。像您的 IDE 这样的想法会以不同的方式突出显示它,并且鉴于工具,您可以重构这些东西,而不是进行文本搜索/替换。
这个link 讨论得很好。
【讨论】:
注意:Symbols 将被弃用,然后在 Scala 3 (dotty) 中被删除。
参考:http://dotty.epfl.ch/docs/reference/dropped-features/symlits.html
因此,我个人建议不要再使用Symbols(至少在新的 scala 代码中)。正如 dotty 文档所述:
不再支持符号文字
建议使用纯字符串文字 [...] 代替
【讨论】:
Python 维护一个“interned strings” 的内部全局表,其中包含所有变量、函数、模块等的名称。有了这个表,解释器可以进行更快的搜索和优化。您可以使用intern 函数(python3 中的sys.intern)强制执行此过程。
此外,Java 和 Scala 自动使用 “interned strings” 来加快搜索速度。使用 scala,您可以使用 intern 方法强制字符串的 intern,但此过程不适用于所有字符串。符号受益于被保证被实习,因此单个引用相等检查足以证明相等或不等。
【讨论】: