| Toán tử | So sánh | Dùng khi |
|---|---|---|
== | giá trị (thường được override) | so sánh tổng quát |
eql? | giá trị và cùng class (dùng cho hash key) | 1.eql?(1.0) → false |
equal? | object identity — cùng object_id | kiểm tra cùng object |
=== | "case equality" — mỗi class override theo nghĩa riêng | when trong case |
ruby
1 == 1.0 # => true (giá trị bằng)
1.eql?(1.0) # => false (khác class: Integer vs Float)
1.equal?(1) # => true (Integer nhỏ cached cùng object)
"a".equal?("a")# => false (2 String object khác nhau)
# === — dùng ngầm trong case/when
case 42
when 1..50 then puts "trong khoảng" # Range#=== gọi include?
when Integer then puts "là integer"
endHình dung: == hỏi "bằng nhau không?", equal? hỏi "có phải cùng một vật không?".
| Operator | Compares | Used for |
|---|---|---|
== | value (often overridden) | general equality |
eql? | value and same class (hash key semantics) | 1.eql?(1.0) → false |
equal? | object identity — same object_id | checking same object |
=== | "case equality" — each class overrides it | when in case expressions |
ruby
1 == 1.0 # => true
1.eql?(1.0) # => false (Integer vs Float)
1.equal?(1) # => true (small integers are cached)
"a".equal?("a")# => false (two distinct String objects)
case 42
when 1..50 then puts "in range" # Range#=== calls include?
when Integer then puts "is integer"
endMental model: == asks "are these equal?", equal? asks "are these literally the same object?".