Answers:
用Java术语来说,符号是内部字符串。例如,这意味着引用相等比较(eq
在Scala和==
Java中)与正常相等比较(==
在Scala和Java中)得出的结果相同equals
:'abcd eq 'abcd
将返回true,而"abcd" eq "abcd"
可能不,这取决于JVM的想法(嗯,应该用于文字,但通常不适用于动态创建的字符串)。
其他使用符号的语言是Lisp(使用'abcd
Scala),Ruby(:abcd
),Erlang和Prolog(abcd
;它们称为原子而不是符号)。
当我不关心字符串的结构时,我会使用符号,而纯粹将其用作某些事物的名称。例如,如果我有一个表示CD的数据库表,其中包含一个名为“ price”的列,则不必关心“ price”中的第二个字符是否为“ r”,也不必关心列名称的串联。因此,Scala中的数据库库可以合理地将符号用于表名和列名。
如果您有一些普通字符串表示代码中的方法名称,而这些字符串可能会被传递出去,那么您就不能很好地传达信息了。这是数据/代码边界的问题,画线并不总是那么容易,但是如果我们说在该示例中,那些方法名比代码多于数据,那么我们希望可以清楚地识别出。
Symbol Literal发挥了作用,它通过代码中使用的构造,可以清楚地区分所有旧字符串数据。它只是在您要指示的地方,这不仅是一些字符串数据,而且实际上是代码的一部分。诸如IDE之类的想法会以不同的方式突出显示它,并且有了工具,您就可以重构它们,而不用进行文本搜索/替换。
该链接对其进行了很好的讨论。
Python包含一个内部“全局字符串”表,其中包含所有变量,函数,模块等的名称。使用此表,解释器可以更快地进行搜索和优化。您可以使用intern
函数(sys.intern
在python3中)强制执行此过程。
而且,Java和Scala自动使用“中间字符串”来加快搜索速度。使用scala,您可以使用该intern
方法强制执行字符串的实习生,但是此过程不适用于所有字符串。符号可以从保证被插入中受益,因此,一次引用相等性检查足以证明相等性或不平等性。