Difference between == vs === and Equal? vs Eql? in Ruby
1. == vs === Khái quát Đều là method so sánh và giá trị trả về là true hoặc false. ==: so sánh value, là kiểu so sánh phổ biến và được sử dụng thường xuyên. ===: cũng là kiểu so sánh value, tuy nhiên nó so sánh theo dạng case (trường hợp), tùy vào từng class mà các case sẽ được implement khác ...
1. == vs ===
Khái quát
Đều là method so sánh và giá trị trả về là true hoặc false. ==: so sánh value, là kiểu so sánh phổ biến và được sử dụng thường xuyên. ===: cũng là kiểu so sánh value, tuy nhiên nó so sánh theo dạng case (trường hợp), tùy vào từng class mà các case sẽ được implement khác nhau. Vd:
1 + 1 == 2 #=> true "a" == "b" #=> false true == true #=> true (1..3) === 2 #=> true (1..3) === 6 #=> false Array === [1, 2] #=> true Hash === [1, 2] #=> false /ub/ === "Ruby" #=> true /rails/ === "Ruby" #=> false
Chú ý:
"a" === "a" #=> true "b" === "b" #=> false 1 === 2 #=> false 1 === 1 #=> true
Có thể thấy === cũng là phép so sánh giá trị thông thường, có điều nó dùng case để so sánh:
Numeric == 1 #=> false Numeric === 1 #=> true
2. Equal? vs Eql?
Khái quát
Eql?: Là method so sánh, sử dụng hash để kiểm tra các hash key xem có giống nhau hay không, và trả về true nếu 2 tham số có cùng hash key. Đối với obj thì eql? sẽ giống như ==. Vd:
"ruby".eql? "java" #=> false [1, 2].eql? [1, 2] #=> true {a: 1, b: 2}.eql? {a: 1, b: 3} #=> false
Tuy nhiên với Numeric thì nó sẽ kiểm tra 2 tham số có cùng giá trị và cùng class hay không. Vd:
1.eql? 1 #=> true 1.eql? 2 #=> false 1.eql? 1.0 #=> false
Có thể thấy 1 và 1.0 tuy cùng giá trị nhưng class của chúng lại khác nhau, 1 thuộc Integer, còn 1.0 là Float, nên giá trị mà eql? trả về là false
Equal?: là method so sánh giá trị và object_id của object. Trong đó object_id là method trả về định danh của obj. Khi 2 đối tượng có cùng object_id thì chứng tỏ 2 obj đó giống nhau (đều trỏ đến cùng 1 đối tượng trong vùng nhớ và ngược lại) vd:
a = "a" a.object_id #=> 12506480 b = "a" b.object_id #=> 12477760 a == b #=> true a.equal? b #=> false
Có thể thấy ở đây dù a và b có cùng value là "a", tuy nhiên object_id của chúng lại khác nhau nên kết quả trả về của phép so sánh Equal? sẽ là false. Thử 1 vd khác:
a = b = "ruby" a.object_id #=> 14016180 b.object_id #=> 14016180 a.equal? b #=> true
Equal? cũng là cách hiệu quả để so sánh con trỏ, check xem có cùng 1 object hay không.
Tham khảo
Bài viết này mình muốn chia sẻ 1 chút về sự khác biệt giữa các method ==, ===, equal? và eql?. Bài viết còn nhiều hạn chế, kiến thức hạn hẹp mong nhận được ý kiến đóng góp. Cảm ơn bạn vì đã đọc bài viết. Nguồn tham khảo: https://viblo.asia/p/su-khac-nhau-cua-eql-equal-trong-so-sanh-va-su-khac-nhau-cua-trong-viec-noi-string-l0rvmmmavyqA