Difference between == vs === and Equal? vs Eql? in Ruby

1. == vs ===

Khái quát

Đều là method đối chiếu và giá trị trả về là true hoặc false.
==: đối chiếu value, là kiểu đối chiếu phổ biến và được dùng liên tục.
===: cũng là kiểu đối chiếu value, mặc dù vậy nó đối chiếu theo dạng case (hoàn cảnh), tùy vào đã có lần 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 

quan tâm:

"a" === "a" #=> true "b" === "b" #=> false 1 === 2 #=> false 1 === 1 #=> true 

Có thể thấy === cũng là phép đối chiếu giá trị thông thường, có điều nó dùng case để đối chiếu:

Numeric == 1 #=> false Numeric === 1 #=> true 

2. Equal? vs Eql?

Khái quát

Eql?: Là method đối chiếu, 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 

mặc dù vậy 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 đối chiếu 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 minh 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", mặc dù vậy object_id của chúng lại khác nhau nên kết quả trả về của phép đối chiếu 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 có tác dụng để đối chiếu 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 giới hạn, 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

Nguồn viblo.asia