ความเท่าเทียมกันหมายความว่าสองสิ่งเหมือนกัน ใน Ruby เราเปรียบเทียบวัตถุและค่าของวัตถุเพื่อดูว่าเป็นวัตถุเดียวกันหรือไม่
คำถามคือ…
คุณเปรียบเทียบสองสิ่งใน Ruby อย่างไร
ถูกใจสิ่งนี้ :
1 == 1 # true
คุณคงคุ้นเคยกับสิ่งนี้แล้ว…
แต่คุณรู้หรือไม่ว่า == เป็นวิธี &ไม่ใช่แค่ไวยากรณ์?
ความหมายนั้นยิ่งใหญ่
คุณสามารถใช้วิธีนี้ในคลาสของคุณเองเพื่อให้มีประสิทธิภาพมากขึ้น และนั่นคือสิ่งที่คุณจะได้เรียนรู้ในโพสต์นี้!
อะไรทำให้วัตถุสองชิ้นเหมือนกัน?
คุณสามารถเปรียบเทียบสองสตริงดังนี้:
"foo" == "foo"
ถ้า คำและอักขระ เหมือนกันก็เท่ากัน
นิพจน์ส่งคืน true .
สิ่งนี้ใช้ได้เพราะ String คลาสดำเนินการ == (สองเครื่องหมายเท่ากับ) วิธีที่รู้วิธีเปรียบเทียบสตริง
แต่ถ้า String ไม่ได้ใช้งาน == ?
Ruby จะใช้ Object การใช้งาน == ซึ่งค่าเริ่มต้นคือการทดสอบเอกลักษณ์ของออบเจ็กต์ แทนที่จะเป็นเนื้อหาของออบเจ็กต์
ตัวอย่าง :
Object.new == Object.new # false String.new == String.new # true
เหตุผล Object ส่งกลับ false เป็นเพราะวัตถุใหม่สองรายการมีรหัสวัตถุที่แตกต่างกัน
ในกรณีของ String เนื่องจากจะเปรียบเทียบตามเนื้อหา และสตริงใหม่สองสตริงมีเนื้อหาเดียวกัน (ว่างเปล่า) จึงส่งคืน true .
การนำความเท่าเทียมกันไปใช้
ตอนนี้ ลองใช้สิ่งที่คุณเพิ่งเรียนรู้เพื่อทำให้ชั้นเรียนของคุณมีประสิทธิภาพมากขึ้นโดยเปรียบเทียบได้
ขอบคุณ == วิธีการ…
คุณสามารถกำหนดได้ว่าคลาสของคุณสองอินสแตนซ์ของคุณมีค่าเท่ากันอย่างไร
ตัวอย่าง :
class Product
attr_reader :name, :price
def initialize(name, price)
@name, @price = name, price
end
def ==(other)
self.name == other.name &&
self.price == other.price
end
end
p1 = Product.new('book', 49)
p2 = Product.new('book', 49)
p1 == p2 # true
== method บอกว่าทั้งชื่อและราคาต้องเหมือนกันทั้ง 2 Product วัตถุให้ถือว่าเท่าเทียมกัน
จำไว้ :
หากคุณไม่ใช้วิธีนี้ (หรือใช้ Comparable โมดูลซึ่งฉันอธิบายไว้ในหนังสือ Ruby ของฉัน) อ็อบเจ็กต์ทั้งสองจะถูกเปรียบเทียบโดยใช้ id อ็อบเจ็กต์ แทนที่จะเป็นค่าของวัตถุ
นอกจากนี้ฉันควรพูดถึงว่าถ้าคุณใช้ Struct มันจะใช้งาน == . อยู่แล้ว เพื่อคุณ
Triple Equals คืออะไร
คุณอาจสงสัยว่า == เป็น method คือ === ยังเป็นวิธีการ? และคำตอบก็คือใช่ 🙂
แล้วทั้งสองต่างกันอย่างไร
ใน Javascript มีความแตกต่างที่ชัดเจน โดยที่ == จะพยายามแปลงประเภทวัตถุให้เหมือนกันถ้าไม่ใช่ (1 vs '1' ). และ === เพื่อความเท่าเทียมกันอย่างเข้มงวด
แต่ในทับทิมไม่มีสิ่งนั้น อะไร === หมายถึงขึ้นอยู่กับคลาสที่นำไปใช้
ในหลายกรณี มันเป็นเพียงนามแฝงสำหรับ == .
ชอบใน String และ Object .
นี่คือตารางของคลาสในตัวที่ให้ === ความหมายพิเศษ:
| คลาส | ความหมาย |
|---|---|
| ช่วง | คืนค่า จริง หาก obj เป็นองค์ประกอบของช่วง มิฉะนั้น จะเป็นเท็จ |
| Regexp | จับคู่ regexp กับสตริง |
| โมดูล | คืนค่า จริง หาก obj เป็นอินสแตนซ์ของ mod หรือและอินสแตนซ์ของลูกหลานของ mod ตัวใดตัวหนึ่ง |
| Proc | เรียกใช้บล็อกด้วย obj เป็นพารามิเตอร์ของ proc เช่น Proc#call . เป็นการอนุญาตให้วัตถุ proc เป็นเป้าหมายของ when ประโยคในกรณีคำสั่ง |
บทสรุป
ในโพสต์นี้ คุณได้เรียนรู้วิธีทำให้ชั้นเรียนของคุณมีประสิทธิภาพมากขึ้นโดยใช้ == กระบวนการ. คุณยังได้เรียนรู้ความแตกต่างระหว่าง == และ === .
อย่าลืม แชร์โพสต์นี้ ให้คนเห็นมากขึ้น 🙂