ตัวอย่างโค้ดของคุณไม่ได้ขยายในหัวข้อของคุณนั่นคือสัญลักษณ์และส่วนนั้นของคำถามจึงไม่มีคำตอบ
หากคุณมีสองสตริง foo และ bar และทั้งสองแบบสามารถเป็นสตริงหรือสัญลักษณ์ได้คุณสามารถทดสอบความเท่าเทียมกันได้ด้วย
foo.to_s == bar.to_s
การข้ามการแปลงสตริงในตัวถูกดำเนินการด้วยประเภทที่รู้จักจะมีประสิทธิภาพมากกว่าเล็กน้อย ดังนั้นถ้า foo เป็นสตริงเสมอ
foo == bar.to_s
แต่ประสิทธิภาพที่เพิ่มขึ้นนั้นแทบจะไม่คุ้มค่าที่จะเรียกร้องงานพิเศษใด ๆ ในนามของผู้โทร
ก่อนที่จะใช้ Ruby 2.2 หลีกเลี่ยงการใช้สตริงอินพุตที่ไม่มีการควบคุมภายในเพื่อจุดประสงค์ในการเปรียบเทียบ (ด้วยสตริงหรือสัญลักษณ์) เนื่องจากสัญลักษณ์ไม่ใช่ขยะที่เก็บรวบรวมดังนั้นคุณจึงสามารถเปิดตัวเองเพื่อปฏิเสธการให้บริการผ่านการหมดทรัพยากร จำกัด การใช้สัญลักษณ์ของคุณเฉพาะค่าที่คุณควบคุมเช่นตัวอักษรในโค้ดของคุณและคุณสมบัติคอนฟิกูเรชันที่เชื่อถือได้
ทับทิม 2.2 แนะนำการเก็บขยะของสัญลักษณ์
foo.intern == bar.intern
จะดีกว่า - การสร้างสตริงโดยเฉลี่ยจะมีประสิทธิภาพมากกว่าการสร้างสตริงจากสัญลักษณ์ (หากสตริงที่กำหนดไว้ก่อนหน้านี้มันจะส่งคืนสัญลักษณ์)