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