12/08/2018, 16:02

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

0