[英]What are some example use cases for symbol literals in Scala?
從我在 Scala 上讀到的內容來看,符號文字的使用並不是很清楚。 有人願意分享一些現實世界的用途嗎?
符號文字是否涵蓋了特定的 Java 習語? 哪些語言有類似的結構? 我來自 Python 背景,不確定該語言中是否有類似的東西。
什么會促使我使用“HelloWorld 與“HelloWorld”?
謝謝
在 Java 術語中,符號是內部字符串。 這意味着,例如,引用相等比較(Scala 中的eq
和 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 中的數據庫庫可以合理地使用表名和列名的符號。
如果您在代碼中使用表示方法名稱的純字符串,可能會被傳遞,那么您就沒有完全正確地傳達信息。 這是一種數據/代碼邊界問題,畫線並不總是那么容易,但如果我們要說在那個例子中那些方法名稱比它們是數據更多的代碼,那么我們想要一些東西來清楚地識別.
符號文字開始發揮作用,它清楚地區分任何舊字符串數據與代碼中使用的構造。 它確實在您想要指示的地方,這不僅僅是一些字符串數據,而且實際上在某種程度上是代碼的一部分。 想法是像您的 IDE 這樣的東西會以不同的方式突出顯示它,並且給定工具,您可以重構這些,而不是進行文本搜索/替換。
這個鏈接很好地討論了它。
注意: Symbols
將被棄用,然后在 Scala 3 (dotty) 中被刪除。
參考: http : //dotty.epfl.ch/docs/reference/dropped-features/symlits.html
因此,我個人建議不要再使用Symbols
(至少在新的 Scala 代碼中)。 正如 dotty 文檔所述:
不再支持符號文字
建議使用純字符串文字 [...] 代替
Python 維護着一個包含所有變量、函數、模塊等名稱的“內部字符串”的內部全局表。有了這個表,解釋器可以進行更快的搜索和優化。 您可以使用intern
函數(python3 中的sys.intern
)強制執行此過程。
此外,Java 和 Scala 會自動使用“內部字符串”來加快搜索速度。 使用 scala,您可以使用intern
方法來強制字符串的實習生,但此過程不適用於所有字符串。 符號受益於保證被實習,因此單個引用相等性檢查就足以證明相等或不相等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.