วิธีที่รัดกุมที่สุดในการทดสอบความเท่าเทียมกันของสตริง (ไม่ใช่ความเท่าเทียมกันของวัตถุ) สำหรับสตริงหรือสัญลักษณ์ Ruby?


87

ฉันทำสิ่งนี้เสมอเพื่อทดสอบความเท่าเทียมกันของสตริงใน Ruby:

if mystring.eql?(yourstring)
 puts "same"
else
 puts "different"
end

นี่เป็นวิธีที่ถูกต้องในการดำเนินการโดยไม่ต้องทดสอบความเท่าเทียมกันของวัตถุหรือไม่?

ฉันกำลังมองหาวิธีที่รัดกุมที่สุดในการทดสอบสตริงตามเนื้อหา

ด้วยวงเล็บและเครื่องหมายคำถามสิ่งนี้ดูเหมือนจะเกะกะเล็กน้อย

คำตอบ:



15

ตัวอย่างโค้ดของคุณไม่ได้ขยายในหัวข้อของคุณนั่นคือสัญลักษณ์และส่วนนั้นของคำถามจึงไม่มีคำตอบ

หากคุณมีสองสตริง foo และ bar และทั้งสองแบบสามารถเป็นสตริงหรือสัญลักษณ์ได้คุณสามารถทดสอบความเท่าเทียมกันได้ด้วย

foo.to_s == bar.to_s

การข้ามการแปลงสตริงในตัวถูกดำเนินการด้วยประเภทที่รู้จักจะมีประสิทธิภาพมากกว่าเล็กน้อย ดังนั้นถ้า foo เป็นสตริงเสมอ

foo == bar.to_s

แต่ประสิทธิภาพที่เพิ่มขึ้นนั้นแทบจะไม่คุ้มค่าที่จะเรียกร้องงานพิเศษใด ๆ ในนามของผู้โทร

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

ทับทิม 2.2 แนะนำการเก็บขยะของสัญลักษณ์


6
foo.intern == bar.internจะดีกว่า - การสร้างสตริงโดยเฉลี่ยจะมีประสิทธิภาพมากกว่าการสร้างสตริงจากสัญลักษณ์ (หากสตริงที่กำหนดไว้ก่อนหน้านี้มันจะส่งคืนสัญลักษณ์)
Chuck

4
อันที่จริงฉันไม่คิดว่าการสร้างสัญลักษณ์จากสตริงเป็นความคิดที่ดีเพียงเพื่อประหยัดค่าใช้จ่ายในการเปรียบเทียบบางอย่างเนื่องจากสัญลักษณ์จะรั่วหากสตริงไม่ตรงกัน สัญลักษณ์ไม่ได้ถูกเก็บรวบรวมดังนั้นจึงไม่ควรสร้างขึ้นหากคุณไม่ต้องการเก็บไว้มิฉะนั้นคุณจะสร้างเวกเตอร์สำหรับการโจมตีปฏิเสธการให้บริการ
Patru

Gee ฉันไม่ได้คิดอย่างนั้น ขอบคุณฉันได้แก้ไขคำตอบตามความคิดเห็นของคุณแล้ว
sheldonh

1
สิ่งนี้จำเป็นต้องได้รับการปรับปรุงใหม่: "หลีกเลี่ยงการควบคุมสตริงอินพุตที่ไม่มีการควบคุม [... ] เนื่องจากสัญลักษณ์ไม่ได้ถูกเก็บรวบรวม" ขอบคุณ @sheldonh.
เนท
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.