Scala中的符号文字有哪些示例用例?


93

从我在Scala上阅读的内容来看,符号文字的使用尚无法立即弄清楚。有人愿意分享一些现实世界的用途吗?

符号文字涵盖了特定的Java习惯用法吗?哪些语言具有类似的构造?我来自Python背景,不确定该语言是否有类似之处。

是什么促使我使用'HelloWorld vs“ HelloWorld”?

谢谢

Answers:


76

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

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

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


25
可能值得记住的是,Scala中的==会执行.equals事情,因此,真正的区别在于使用引用相等的“ eq”方法时。不过,好处之一是符号之间的比较非常便宜。
Calum

@Calum,以及两个字符串之间的比较。Java实习生(或多或少)所有字符串。
Elazar Leibovich 2010年

4
@Elazar:是真的吗?我给人的印象是,Java只保留文字(即,琐碎的示例中几乎所有字符串,而生产软件中几乎没有字符串)。话虽如此,符号的用例通常是文字值(我怀疑您经常从头开始构建它们),因此可以说,您获得的主要优点只是更具描述性的类型。
Calum 2010年

1
@Elazar并非如此,因为Symbols可以依赖于其值的求值,而Strings是可选的,并且可以优化一些用例。符号更像是动态创建的Enum。我在上次答复中链接的答案中对此进行了详细说明;请阅读更多。
Calum

3
所以,“你好,世界!” 是字符的顺序集合,而“ helloWorld是对人友好的价值而不是14392。”
CW

26

如果您有一些普通字符串表示代码中的方法名称,而这些字符串可能会被传递出去,那么您就不能很好地传达信息了。这是数据/代码边界的问题,画线并不总是那么容易,但是如果我们说在该示例中,那些方法名比代码多于数据,那么我们希望可以清楚地识别出。

Symbol Literal发挥了作用,它通过代码中使用的构造,可以清楚地区分所有旧字符串数据。它只是在您要指示的地方,这不仅是一些字符串数据,而且实际上是代码的一部分。诸如IDE之类的想法会以不同的方式突出显示它,并且有了工具,您就可以重构它们,而不用进行文本搜索/替换。

链接对其进行了很好的讨论。


1
这是很有帮助的解释。它使我想到了枚举的替代方法-可能很笨拙
-javadba

2

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

而且,Java和Scala自动使用“中间字符串”来加快搜索速度。使用scala,您可以使用该intern方法强制执行字符串的实习生,但是此过程不适用于所有字符串。符号可以从保证被插入中受益,因此,一次引用相等性检查足以证明相等性或不平等性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.