ตัวอย่างการใช้งานสำหรับตัวอักษรสัญลักษณ์ใน Scala มีอะไรบ้าง


93

การใช้ตัวอักษรสัญลักษณ์ยังไม่ชัดเจนในทันทีจากสิ่งที่ฉันได้อ่านเกี่ยวกับ Scala ใครสนใจที่จะแบ่งปันการใช้งานในโลกแห่งความเป็นจริงบ้าง?

มีสำนวน Java เฉพาะที่ครอบคลุมโดยตัวอักษรสัญลักษณ์หรือไม่? ภาษาใดมีโครงสร้างคล้ายกัน ฉันมาจากพื้นหลัง Python และไม่แน่ใจว่ามีอะไรที่คล้ายคลึงกันในภาษานั้น

อะไรเป็นแรงจูงใจให้ฉันใช้ "HelloWorld กับ" HelloWorld "

ขอบคุณ

คำตอบ:


77

ในคำศัพท์ Java สัญลักษณ์เป็นสตริงภายใน ซึ่งหมายความว่าตัวอย่างเช่นการอ้างอิงการเปรียบเทียบความเท่าเทียมกัน ( eqใน Scala และ==ใน Java) ให้ผลลัพธ์เช่นเดียวกับการเปรียบเทียบความเท่าเทียมกันตามปกติ ( ==ใน Scala และequalsใน Java): 'abcd eq 'abcdจะคืนค่าจริงในขณะที่"abcd" eq "abcd"อาจไม่ขึ้นอยู่กับความต้องการของ JVM (ก็ควร สำหรับตัวอักษร แต่ไม่ใช่สำหรับสตริงที่สร้างแบบไดนามิกโดยทั่วไป)

ภาษาอื่น ๆ ที่ใช้สัญลักษณ์ ได้แก่ Lisp (ซึ่งใช้'abcdเหมือน Scala), Ruby ( :abcd), Erlang และ Prolog ( abcdเรียกว่าอะตอมแทนสัญลักษณ์)

ฉันจะใช้สัญลักษณ์เมื่อฉันไม่สนใจโครงสร้างของสตริงและใช้มันเป็นชื่อของบางสิ่งเท่านั้น ตัวอย่างเช่นถ้าฉันมีตารางฐานข้อมูลที่เป็นตัวแทนของซีดีซึ่งมีคอลัมน์ชื่อ "price" ฉันไม่สนใจว่าอักขระตัวที่สองใน "price" คือ "r" หรือเกี่ยวกับการต่อชื่อคอลัมน์ ดังนั้นไลบรารีฐานข้อมูลใน Scala จึงสามารถใช้สัญลักษณ์สำหรับชื่อตารางและคอลัมน์ได้อย่างสมเหตุสมผล


25
มันอาจจะคุ้มค่าที่จะจำได้ว่า == ใน Scala ทำสิ่งที่เท่ากันดังนั้นความแตกต่างก็คือเมื่อใช้เมธอด "eq" ซึ่งอ้างอิงความเท่าเทียมกัน อย่างไรก็ตามโบนัสอย่างหนึ่งคือการเปรียบเทียบระหว่างสัญลักษณ์นั้นถูกมาก
Calum

@ Calum เช่นเดียวกับการเปรียบเทียบระหว่างสองสาย Java interns (มากหรือน้อย) สตริงทั้งหมด
Elazar Leibovich

4
@Elazar: จริงเหรอ? ฉันรู้สึกว่า Java เป็นเพียงตัวอักษรที่ใช้งานได้ภายใน (กล่าวคือเกือบทุกสตริงในตัวอย่างที่ไม่สำคัญและแทบไม่มีสตริงใดในซอฟต์แวร์การผลิต) ต้องบอกว่ากรณีการใช้งานของสัญลักษณ์มักจะเป็นค่าตามตัวอักษร (ฉันสงสัยว่าคุณมักสร้างขึ้นใหม่ตั้งแต่ต้น) ดังนั้นประโยชน์หลักที่คุณได้รับก็คือประเภทที่สื่อความหมายได้ดีกว่า
Calum

1
@Elazar ไม่ใช่เพราะ Symbols สามารถพึ่งพามูลค่าของมันได้ในขณะที่ Strings เป็นตัวเลือกและสามารถเพิ่มประสิทธิภาพการใช้งานบางกรณีได้ สัญลักษณ์เป็นเหมือน Enums ที่สร้างขึ้นแบบไดนามิกมากกว่าสิ่งใด ๆ ฉันอธิบายรายละเอียดเกี่ยวกับคำตอบที่ฉันเชื่อมโยงในคำตอบล่าสุดของฉัน โปรดอ่านเพิ่มเติม
Calum

3
ดังนั้น "สวัสดีชาวโลก!" เป็นคอลเลกชันที่ต่อเนื่องของตัวละครในขณะที่ 'helloWorld เป็นค่าที่เป็นมิตรกับผู้คนมากกว่า 14392
CW Holeman II

26

หากคุณมีสตริงธรรมดาที่แสดงถึงชื่อวิธีการพูดในโค้ดซึ่งอาจจะถูกส่งต่อไปได้แสดงว่าคุณไม่ได้ถ่ายทอดสิ่งต่างๆอย่างเหมาะสม นี่เป็นปัญหาขอบเขตข้อมูล / รหัสการลากเส้นไม่ใช่เรื่องง่ายเสมอไป แต่ถ้าเราจะบอกว่าในตัวอย่างนั้นชื่อวิธีการเหล่านั้นมีรหัสมากกว่าที่เป็นข้อมูลเราจึงต้องการบางสิ่งที่ระบุอย่างชัดเจนว่า .

Symbol Literal เข้ามามีบทบาทในการสร้างความแตกต่างอย่างชัดเจนกับข้อมูลสตริงเก่า ๆ ที่มีโครงสร้างที่ใช้ในโค้ด มันอยู่ตรงนั้นจริงๆที่คุณต้องการระบุนี่ไม่ใช่แค่ข้อมูลสตริงบางส่วนเท่านั้น แต่ในความเป็นจริงเป็นส่วนหนึ่งของโค้ด แนวคิดที่เป็นสิ่งต่าง ๆ เช่น IDE ของคุณจะเน้นให้แตกต่างกันและเมื่อใช้เครื่องมือคุณสามารถ refactor กับสิ่งเหล่านั้นแทนที่จะทำการค้นหา / แทนที่ข้อความ

ลิงค์นี้อธิบายได้ดีพอสมควร


2
นี่คือคำอธิบายที่เป็นประโยชน์ มันทำให้ฉันคิดในแง่ของทางเลือกแทน enums - ซึ่งอาจจะเงอะงะ
StephenBoesch

2

Python มีตารางโกลบอลภายในของ"สตริงภายใน" ที่มีชื่อของตัวแปรฟังก์ชันโมดูลและอื่น ๆ ทั้งหมดด้วยตารางนี้ตัวแปลสามารถทำการค้นหาและเพิ่มประสิทธิภาพได้เร็วขึ้น คุณสามารถบังคับกระบวนการนี้ด้วยinternฟังก์ชัน ( sys.internใน python3)

นอกจากนี้ Java และ Scala จะใช้"สตริงภายใน"โดยอัตโนมัติเพื่อการค้นหาที่รวดเร็วขึ้น ด้วย scala คุณสามารถใช้internวิธีบังคับให้ฝึกงานของสตริงได้ แต่กระบวนการนี้ใช้ไม่ได้กับทุกสตริง สัญลักษณ์ได้รับประโยชน์จากการรับประกันว่าจะอยู่ภายในดังนั้นการตรวจสอบความเท่าเทียมกันอ้างอิงเพียงครั้งเดียวจึงเพียงพอที่จะพิสูจน์ความเท่าเทียมหรือความไม่เท่าเทียมกัน


1

หมายเหตุ: Symbolsจะเลิกใช้งานแล้วนำออกใน Scala 3 (ไม่เป็นระเบียบ)

อ้างอิง: http://dotty.epfl.ch/docs/reference/dropped-features/symlits.html

ด้วยเหตุนี้ฉันเองจึงไม่แนะนำให้ใช้Symbolsอีกต่อไป (อย่างน้อยก็ในรหัส scala ใหม่) ตามที่เอกสารที่ไม่สมบูรณ์ระบุ:

ไม่รองรับตัวอักษรสัญลักษณ์อีกต่อไป

ขอแนะนำให้ใช้ลิเทอรัลสตริงธรรมดา [... ] แทน


1
Wild ที่ฉันโพสต์คำถามนี้เมื่อ 11 ปีที่แล้ว ขอบคุณสำหรับการติดตาม
Joe Holloway
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.