ความเท่าเทียมกันหมายความว่าสองสิ่งเหมือนกัน ใน 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 ประโยคในกรณีคำสั่ง |
บทสรุป
ในโพสต์นี้ คุณได้เรียนรู้วิธีทำให้ชั้นเรียนของคุณมีประสิทธิภาพมากขึ้นโดยใช้ ==
กระบวนการ. คุณยังได้เรียนรู้ความแตกต่างระหว่าง ==
และ ===
.
อย่าลืม แชร์โพสต์นี้ ให้คนเห็นมากขึ้น 🙂