+2

Ruby Equality

Làm thế nào bạn so sánh trong Ruby? == là cái bạn nghĩ đến và sử dụng... nhưng bạn có biết rằng == mà một method và nó không chỉ là syntax? Bạn có thể implement method này trong chính class của bạn để thấy được sự mạnh mẽ của nó. Và đó là điều tôi muốn nói trong bài viết này.

Equality Basic

Như bạn biết, chúng ta có thể so sánh 2 string đơn giản như sau.

"foo" == "foo"

Nếu nội dung bằng nhau thì sẽ trả về giá trị là true Tại sao có thể làm được điều này? Vì String đã implement một method là == để nó biết làm thế nào để so sánh chuỗi. Trong Object cũng implement method ==, method này được dùng để so sánh nhận dạng đối tượng thay vì so sánh nội dung đối tượng.

Object.new  == Object.new 
=> false
String.new == String.new
=> true

Implementing Equality

Bây giờ chúng ta sẽ sử dụng những thứ vừa biết được ở trên để áp dụng vào class của chúng ta.

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 == yêu cầu cả nameprice cùng giống nhau thì 2 object của Product mới được coi là bằng nhau. Còn nếu chúng ta không implement method == thì 2 object được so sánh với nhau bằng cách dựa vào id của object.

What About Triple Equals?

Bạn có thể tự hỏi nếu == là method, vậy còn === thì sao? Và câu trả lời nó cũng là method. Vậy, 2 method đấy khác gì nhau? Trong javascript, có sự khác biệt rõ ràng. Khi chúng ta sử dụng == nó sẽ cố gắng convert kiểu đối tượng cho giống nhau nếu chúng khác nhau(1 vs '1'). Còn với === thì gọi là so sánh chính xác. Nhưng trong Ruby thì không như vậy. === phụ thuộc vào chính lớp implement method đó. Trong nhiều trường hợp, nó có thể coi là giống với == (String và Object) Dưới đây là bảng mô tả method === theo từng class

Conclusion

Trong bài viết này, chúng ta đã học được cách implement method == trong class, và sự khác nhau giữ =====

Bài viết được dịch từ nguồn blackbytes.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí