Computer >> Máy Tính >  >> Lập trình >> Ruby

Cách so sánh hai đối tượng trong Ruby bằng cách thực hiện bình đẳng

Bình đẳng có nghĩa là hai thứ giống nhau. Trong Ruby, chúng tôi so sánh các đối tượng và giá trị của chúng để tìm hiểu xem chúng có phải là cùng một đối tượng hay không.

Câu hỏi là…

Làm thế nào để bạn so sánh hai thứ trong Ruby?

Như thế này :

1 == 1

# true

Có thể bạn đã quen thuộc với điều này…

Nhưng bạn có biết rằng == là một phương thức chứ không chỉ là cú pháp?

Ý nghĩa rất lớn.

Bạn có thể triển khai phương pháp này trong các lớp của riêng mình để làm cho chúng mạnh hơn. Và đó là những gì bạn sẽ tìm hiểu trong bài đăng này!

Điều gì làm cho hai vật thể giống nhau?

Bạn có thể so sánh hai chuỗi như thế này:

"foo" == "foo"

Nếu từ &ký tự giống nhau, thì chúng bình đẳng.

Biểu thức trả về true .

Điều này hoạt động vì String lớp thực hiện một == (hai dấu bằng) biết cách so sánh các chuỗi.

Nhưng điều gì sẽ xảy ra nếu String không triển khai == ?

Sau đó, Ruby sẽ sử dụng Object Triển khai của == , mặc định là kiểm tra nhận dạng đối tượng, thay vì nội dung đối tượng.

Ví dụ :

Object.new == Object.new # false
String.new == String.new # true

Lý do Object trả về false là do hai đối tượng mới có id đối tượng khác nhau.

Trong trường hợp của String , vì nó so sánh dựa trên nội dung và hai chuỗi mới có cùng nội dung (chúng trống) nên nó trả về true .

Thực hiện bình đẳng

Bây giờ, hãy sử dụng những gì bạn vừa học được để làm cho các lớp học của riêng bạn trở nên mạnh mẽ hơn bằng cách có thể so sánh chúng.

Cảm ơn == phương pháp…

Bạn có thể xác định chính xác ý nghĩa của việc hai phiên bản của lớp riêng của bạn bằng nhau.

Ví dụ :

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

== phương thức nói rằng cả tên và giá phải giống nhau cho hai Product các đối tượng được coi là bình đẳng.

Hãy nhớ :

Nếu bạn không triển khai phương pháp này (hoặc sử dụng Comparable mô-đun mà tôi giải thích trong cuốn sách Ruby của mình) hai đối tượng sẽ được so sánh bằng cách sử dụng id đối tượng của chúng, thay vì giá trị của chúng.

Ngoài ra, tôi nên đề cập rằng nếu bạn sử dụng Cấu trúc, nó đã thực hiện == cho bạn.

Còn về Ba bằng?

Bạn có thể tự hỏi nếu == là một phương thức, là === cũng là một phương pháp? Và câu trả lời là có 🙂

Vậy sự khác biệt giữa hai loại này là gì?

Trong Javascript có một sự khác biệt rõ ràng, ở đây == sẽ cố gắng chuyển đổi các loại đối tượng để giống nhau nếu chúng không giống nhau (1 so với '1' ). Và === là bình đẳng 'nghiêm ngặt'.

Nhưng trong Ruby không có điều đó. Cái gì === nghĩa là phụ thuộc vào lớp thực hiện nó.

Trong nhiều trường hợp, nó chỉ là bí danh cho == .

Giống như trong StringObject .

Dưới đây là bảng các lớp tích hợp cung cấp === một ý nghĩa đặc biệt:

Lớp Ý nghĩa
Phạm vi Trả về true nếu obj là một phần tử của dải ô, ngược lại là false.
Regexp Khớp regexp với một chuỗi.
Mô-đun Trả về true nếu obj là một bản sao của mod hoặc và bản sao của một trong các con của mod.
Proc Gọi khối có obj làm tham số của proc như Proc#call . Nó là để cho phép một đối tượng proc là mục tiêu của một when mệnh đề trong một tuyên bố trường hợp.

Kết luận

Trong bài đăng này, bạn đã học cách làm cho các lớp của mình mạnh mẽ hơn bằng cách triển khai == phương pháp. Bạn cũng đã biết được sự khác biệt giữa ===== .

Đừng quên chia sẻ bài đăng này để nhiều người có thể nhìn thấy nó 🙂