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 String
và Object
.
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 ==
và ===
.
Đừng quên chia sẻ bài đăng này để nhiều người có thể nhìn thấy nó 🙂