ดังนั้นทำไมผู้สร้าง Ruby จึงต้องใช้แนวคิดsymbolsในภาษา?
พวกเขาไม่ได้ "ต้อง" อย่างเคร่งครัดพวกเขาเลือกที่จะ นอกจากนี้โปรดทราบว่าการพูดอย่างเคร่งครัดSymbolไม่ได้เป็นส่วนหนึ่งของภาษา แต่เป็นส่วนหนึ่งของห้องสมุดหลัก พวกเขาจะมีภาษาระดับไวยากรณ์ที่แท้จริง Symbol::newแต่พวกเขาจะทำงานก็เช่นกันถ้าคุณต้องสร้างให้พวกเขาโดยการเรียก
ฉันถามจากมุมมองของโปรแกรมเมอร์ที่ไม่ใช่ทับทิมที่พยายามเข้าใจ ฉันได้เรียนรู้จำนวนมากและภาษาอื่น ๆ symbolsที่พบในไม่มีของพวกเขาจำเป็นที่จะต้องระบุถ้าผมจัดการหรือไม่กับสิ่งที่โทรทับทิม
คุณไม่ได้พูดว่า "ภาษาอื่น ๆ อีกมากมาย" คืออะไร แต่นี่เป็นเพียงส่วนย่อของภาษาที่มีSymbolประเภทข้อมูลเช่น Ruby:
นอกจากนี้ยังมีภาษาอื่น ๆ ที่ให้คุณสมบัติของSymbols ในรูปแบบที่แตกต่างกัน ใน Java เช่นคุณสมบัติของทับทิมของStrings จะถูกแบ่งออกเป็นสอง (ที่จริงสาม) ประเภทStringและ/StringBuilder StringBufferบนมืออื่น ๆ , คุณสมบัติของทับทิมของSymbolชนิดพับลงใน Java Stringประเภท: Java Strings สามารถฝึกงาน , สตริงตัวอักษรและStrings ซึ่งเป็นผลมาจากการรวบรวมเวลาการประเมินการแสดงออกคงมีการฝึกงานโดยอัตโนมัติสร้างแบบไดนามิกStrings สามารถฝึกงานโดยการเรียกString.internวิธี การฝึกงานStringใน Java นั้นเหมือนกับSymbolใน Ruby แต่ไม่ได้นำมาใช้เป็นประเภทแยกต่างหากเป็นเพียงสถานะที่แตกต่างที่ JavaStringสามารถอยู่ได้ (หมายเหตุ: ในทับทิมรุ่นก่อนหน้านี้String#to_symเคยถูกเรียกใช้String#internและวิธีการดังกล่าวยังคงมีอยู่ในปัจจุบันในฐานะนามแฝงดั้งเดิม)
คำถามหลักอาจเป็น: แนวคิดของsymbolsRuby มีอยู่ในฐานะเจตนาการปฏิบัติงานเหนือตนเองและภาษาอื่น ๆ หรือไม่
Symbols เป็นครั้งแรกและสำคัญที่สุดประเภทข้อมูลที่เฉพาะเจาะจงกับความหมาย ความหมายเหล่านี้ยังทำให้สามารถดำเนินการการปฏิบัติงานของนักแสดงบางคนได้ (เช่นการทดสอบความเท่าเทียมกันอย่างรวดเร็ว O (1)) แต่นั่นไม่ใช่จุดประสงค์หลัก
หรือสิ่งที่จำเป็นต้องมีอยู่เพราะวิธีการเขียนภาษา?
Symbolไม่จำเป็นต้องใช้ภาษา Ruby เลย Ruby จะทำงานได้ดีหากไม่มีพวกเขา พวกเขาล้วนมีคุณสมบัติห้องสมุด มีที่เดียวในภาษาที่เชื่อมโยงกับSymbols: defนิพจน์นิยามเมธอดจะประเมินค่าเพื่อSymbolแสดงชื่อของวิธีการที่ถูกกำหนด อย่างไรก็ตามนั่นเป็นการเปลี่ยนแปลงที่ค่อนข้างเร็ว ๆ นี้ก่อนหน้านั้นค่าส่งคืนนั้นไม่ได้ระบุเพียง MRI ประเมินเพียงแค่nilRubinius ประเมินว่าเป็นRubinius::CompiledMethodวัตถุและอื่น ๆ นอกจากนี้ยังจะเป็นไปได้ในการประเมินไปยังUnboundMethod... Stringหรือเพียงแค่
โปรแกรมใน Ruby จะเบาลงและ / หรือเร็วกว่านั้นหรือไม่สมมติว่า Python หรือ Node ถ้าเป็นเช่นนั้นมันจะเป็นเพราะsymbolsอะไร?
ฉันไม่แน่ใจว่าคุณถามอะไรที่นี่ ประสิทธิภาพส่วนใหญ่เป็นเรื่องของคุณภาพการใช้งานไม่ใช่ภาษา นอกจากนี้โหนดยังไม่ได้เป็นภาษา แต่เป็นเฟรมเวิร์ก I / O ที่มีเหตุการณ์สำหรับ ECMAScript การเรียกใช้สคริปต์ที่เทียบเท่าบน IronPython และ MRI นั้น IronPython นั้นน่าจะเร็วกว่า การรันสคริปต์ที่เทียบเท่าบน CPython และ JRuby + Truffle, JRuby + Truffle น่าจะเร็วกว่า สิ่งนี้ไม่เกี่ยวกับSymbols แต่ด้วยคุณภาพของการนำไปใช้งาน: JRuby + Truffle มีคอมไพเลอร์ที่ปรับให้เหมาะสมอย่างจริงจังรวมถึงเครื่องมือเพิ่มประสิทธิภาพทั้งหมดของ JVM ประสิทธิภาพสูง CPython เป็นล่ามง่าย
เนื่องจากหนึ่งในความตั้งใจของรูบี้คือการอ่านและเขียนง่ายสำหรับมนุษย์ผู้สร้างของมันไม่สามารถลดขั้นตอนการเขียนโค้ดโดยใช้การปรับปรุงเหล่านั้นในล่ามเอง (เพราะอาจเป็นภาษาอื่น)
ไม่Symbols ไม่ได้เป็นการเพิ่มประสิทธิภาพของคอมไพเลอร์ พวกเขาเป็นประเภทข้อมูลแยกต่างหากที่มีความหมายเฉพาะ พวกเขาไม่เหมือนฟลานุมของ YARV ซึ่งเป็นการเพิ่มประสิทธิภาพภายในส่วนตัวสำหรับFloats สถานการณ์ไม่ได้เช่นเดียวกับInteger, BignumและFixnumซึ่งควรจะมีรายละเอียดการเพิ่มประสิทธิภาพการมองไม่เห็นส่วนตัวภายใน แต่น่าเสียดายที่ไม่ได้เป็น (ซึ่งในที่สุดก็จะได้รับการแก้ไขในทับทิม 2.4 ซึ่งจะลบFixnumและBignumและใบเพียงInteger.)
การทำในแบบที่ Java ทำนั้นเป็นสถานะพิเศษของStrings ปกติหมายความว่าคุณจำเป็นต้องระวังเสมอว่าStrings ของคุณอยู่ในสถานะพิเศษนั้นหรือไม่และภายใต้สถานการณ์ใดที่พวกเขาอยู่ในสถานะพิเศษนั้นโดยอัตโนมัติและเมื่อใด นั่นเป็นภาระที่สูงกว่าการมีประเภทข้อมูลแยกต่างหาก
จะมีคำจำกัดความเกี่ยวกับสัญลักษณ์ของผู้ไม่เชื่อเรื่องภาษาและมีเหตุผลในการใช้ภาษาอื่นหรือไม่?
Symbolเป็นประเภทข้อมูลที่หมายถึงแนวคิดของการที่ชื่อหรือฉลาก Symbols คือวัตถุที่มีค่าไม่เปลี่ยนรูปมักจะทันที สองSymbols ชมีค่าเท่ากันนอกจากนี้ยังมีการรับประกันที่จะเหมือนกันในคำอื่น ๆ สองSymbols Symbolซึ่งเท่ากับเป็นจริงหนึ่งเดียวกัน ซึ่งหมายความว่าความเท่าเทียมกันของคุณค่าและความเท่าเทียมกันของการอ้างอิงเป็นสิ่งเดียวกันดังนั้นความเสมอภาคนั้นมีประสิทธิภาพและ O (1)
เหตุผลที่ทำให้พวกเขามีภาษาเหมือนกันจริงๆเป็นอิสระจากภาษา บางภาษาพึ่งพาพวกเขามากกว่าคนอื่น
ตัวอย่างเช่นในตระกูล Lisp ไม่มีแนวคิดของ "ตัวแปร" คุณมีSymbolความเกี่ยวข้องกับค่าต่างๆแทน
ในภาษาที่มีความสามารถในการสะท้อนแสงหรือครุ่นคิดSymbolมักจะใช้เพื่อแสดงถึงชื่อของหน่วยงานที่สะท้อนให้เห็นใน APIs สะท้อนเช่นในทับทิมObject#methods, Object#singleton_methods, Object#public_methods, Object#protected_methodsและObject#public_methodsกลับArrayของSymbols (แม้ว่าพวกเขาจะได้ก็เช่นกันกลับArrayของMethods) Object#public_sendใช้Symboldenoting ชื่อของข้อความเพื่อส่งเป็นอาร์กิวเมนต์ (แม้ว่าจะยอมรับStringเช่นกันSymbolก็มีความหมายถูกต้องมากกว่า)
ใน ECMAScript Symbols เป็นหน่วยการสร้างพื้นฐานของการทำให้ ECMAScript มีความปลอดภัยในอนาคต พวกเขายังมีบทบาทสำคัญในการสะท้อน