Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

วิธีเปรียบเทียบสองวัตถุในทับทิมโดยการใช้ความเท่าเทียมกัน

ความเท่าเทียมกันหมายความว่าสองสิ่งเหมือนกัน ใน 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 ประโยคในกรณีคำสั่ง

บทสรุป

ในโพสต์นี้ คุณได้เรียนรู้วิธีทำให้ชั้นเรียนของคุณมีประสิทธิภาพมากขึ้นโดยใช้ == กระบวนการ. คุณยังได้เรียนรู้ความแตกต่างระหว่าง == และ === .

อย่าลืม แชร์โพสต์นี้ ให้คนเห็นมากขึ้น 🙂