【问题标题】:What are some example use cases for symbol literals in Scala?Scala 中符号文字的一些示例用例是什么?
【发布时间】:2010-10-21 06:51:12
【问题描述】:

从我在 Scala 上读到的内容中,符号文字的使用并不是很清楚。有人愿意分享一些现实世界的用途吗?

符号文字是否涵盖了特定的 Java 习惯用法?哪些语言有类似的结构?我来自 Python 背景,不确定该语言中有什么类似的东西。

是什么促使我使用“HelloWorld”与“HelloWorld”?

谢谢

【问题讨论】:

    标签: syntax scala


    【解决方案1】:

    在 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 中的数据库库可以合理地使用符号来表示表名和列名。

    【讨论】:

    • 可能值得记住的是,Scala 中的 == 做了 .equals 的事情,所以真正的区别在于使用引用相等的“eq”方法时。不过,一个好处是符号之间的比较非常便宜。
    • @Calum,两个字符串之间的比较也是如此。 Java 实习生(或多或少)所有字符串。
    • @Elazar:这是真的吗?我的印象是 Java 只保留了文字(即在琐碎的示例中几乎所有字符串,而在生产软件中几乎没有字符串)。话虽如此,符号的用例通常是文字值(我怀疑您经常从头开始构建它们),因此可以说您获得的主要优势只是更具描述性的类型。
    • @Elazar 它们不是,因为符号可以依赖于它们的值被实习,而使用字符串它是可选的并且可以优化一些用例。符号更像是动态创建的枚举。我在上次回复中链接的答案中对此进行了详细说明;请阅读更多信息。
    • 所以,“你好,世界!”是字符的连续集合,而 'helloWorld 是人们友好的值,而不是 14392。
    【解决方案2】:

    如果您在代码中有表示方法名称的纯字符串,这些字符串可能会被传递,那么您就没有完全正确地传达信息。这有点像数据/代码边界问题,画线并不总是那么容易,但如果我们说在那个例子中这些方法名称是代码而不是数据,那么我们想要一些东西来清楚地识别.

    符号文字开始发挥作用,它清楚地区分任何旧字符串数据和代码中使用的构造。它就在你想指出的地方,这不仅仅是一些字符串数据,实际上是代码的一部分。像您的 IDE 这样的想法会以不同的方式突出显示它,并且鉴于工具,您可以重构这些东西,而不是进行文本搜索/替换。

    这个link 讨论得很好。

    【讨论】:

    • 这是一个很有帮助的解释。这让我想到了枚举的替代方案——这可能很笨拙
    【解决方案3】:

    注意:Symbols 将被弃用,然后在 Scala 3 (dotty) 中被删除。

    参考:http://dotty.epfl.ch/docs/reference/dropped-features/symlits.html

    因此,我个人建议不要再使用Symbols(至少在新的 scala 代码中)。正如 dotty 文档所述:

    不再支持符号文字

    建议使用纯字符串文字 [...] 代替

    【讨论】:

    • 我在 11 年前发布了这个问题。感谢您的跟进
    【解决方案4】:

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

    此外,Java 和 Scala 自动使用 “interned strings” 来加快搜索速度。使用 scala,您可以使用 intern 方法强制字符串的 intern,但此过程不适用于所有字符串。符号受益于被保证被实习,因此单个引用相等检查足以证明相等或不等。

    【讨论】:

      猜你喜欢
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      相关资源
      最近更新 更多