Difference between == vs === and Equal? vs Eql? in Ruby
Bài đăng này đã không được cập nhật trong 7 năm
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
All rights reserved