我从Scala上读到的内容并没有立即清楚地使用符号文字。有人愿意分享一些现实世界的用途吗?
符号文字是否包含特定的Java习惯用法?哪些语言有相似的结构?我来自Python背景,不确定那种语言有什么类似的东西。
什么会激励我使用'HelloWorld vs“HelloWorld”?
由于
答案 0 :(得分:72)
在Java术语中,符号是实习字符串。这意味着,例如,引用相等性比较(Scala中的eq
和Java中的==
)与正常的相等比较({1}}在Scala和==
中的结果相同。 Java):equals
将返回true,而'abcd eq 'abcd
可能不会,这取决于JVM的奇思妙想(好吧,它应该用于文字,但不适用于一般动态创建的字符串)。
使用符号的其他语言是Lisp(使用{1}},如Scala),Ruby("abcd" eq "abcd"
),Erlang和Prolog('abcd
;它们被称为原子而不是符号)。
当我不关心字符串的结构时,我会使用符号,并将其纯粹用作某事物的名称。例如,如果我有一个表示CD的数据库表,其中包含一个名为“price”的列,我不关心“price”中的第二个字符是“r”,还是关于连接列名;因此,Scala中的数据库库可以合理地使用表和列名称的符号。
答案 1 :(得分:25)
如果你在代码中有简单的字符串表示方法名称,那可能会被传递,你就不能正确传达事物了。这是一种数据/代码边界问题,绘制线并不总是那么容易,但是如果我们说在那个例子中那些方法名称的代码多于它们的数据,那么我们需要一些东西来清楚地识别
Symbol Literal开始发挥作用,它可以清楚地区分任何旧字符串数据与代码中使用的构造。它只是你想要指出的地方,这不仅仅是一些字符串数据,实际上在某种程度上是代码的一部分。像你的IDE这样的想法会以不同的方式强调它,并且考虑到工具,你可以重构这些,而不是进行文本搜索/替换。
这link对此进行了很好的讨论。
答案 2 :(得分:1)
注意:Symbols
将被弃用,然后在Scala 3(dotty)中删除。
参考:http://dotty.epfl.ch/docs/reference/dropped-features/symlits.html
因此,我个人建议不再使用Symbols
(至少在新的Scala代码中)。如文档所述:
不再支持符号文字
建议改用纯文本字符串[...]