Ruby Equality
Bài đăng này đã không được cập nhật trong 3 năm
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ả name
và price
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ữ ==
và ===
Bài viết được dịch từ nguồn blackbytes.
All rights reserved