Are your objects truly the same, or just pretending to be?
Object identity (equal? vs ==) in Ruby - When to Use Which
Imagine you have two boxes that look exactly the same and contain the same toys. You want to check if they are the same box or just two boxes with the same toys.
Manually checking if two things are exactly the same object or just look alike is confusing and easy to get wrong. You might think two things are equal because they look the same, but they could be different objects in memory.
Ruby gives you two ways to compare: == checks if two objects look equal, while equal? checks if they are the exact same object. This helps you avoid mistakes and understand your program better.
if a == b puts 'Looks equal' end if a.equal?(b) puts 'Same object' end
puts 'Equal in value' if a == b puts 'Identical object' if a.equal?(b)
This concept lets you clearly tell when two things are just alike or truly the same, helping you write smarter and bug-free code.
When you copy a list of friends, you want to know if you have a new list with the same names or just another name tag pointing to the original list.
== checks if objects look equal.
equal? checks if objects are the exact same.
Knowing the difference helps avoid bugs and confusion.
Practice
equal? check between two objects?Solution
Step 1: Understand
Theequal?method purposeequal?method checks if two variables reference the exact same object in memory, not just if they look alike.Step 2: Compare with other methods
Unlike==, which compares content,equal?is about object identity.Final Answer:
If both variables point to the exact same object in memory -> Option CQuick Check:
equal?checks object identity = D [OK]
equal? means same object, not just same value [OK]- Confusing
equal?with== - Thinking
equal?compares content - Assuming
equal?checks class type
equal? to check if two variables refer to the same object?Solution
Step 1: Recall correct syntax for
The methodequal?equal?is called on one object and passed another as an argument, likea.equal?(b).Step 2: Identify incorrect options
a == buses content equality,a.equals(b)is not a Ruby method, andequal?(a, b)is invalid syntax.Final Answer:
a.equal?(b) -> Option AQuick Check:
Correctequal?syntax = B [OK]
object.equal?(other_object) syntax [OK]- Using
==instead ofequal? - Writing
equalsinstead ofequal? - Calling
equal?as a standalone function
a = "hello" b = "hello" puts a == b puts a.equal?(b)
Solution
Step 1: Evaluate
Botha == baandbare strings with the same content "hello", soa == breturnstrue.Step 2: Evaluate
Though content is same,a.equal?(b)aandbare different string objects, soequal?returnsfalse.Final Answer:
true false -> Option BQuick Check:
==compares content,equal?compares object identity = C [OK]
== checks value, equal? checks same object [OK]- Assuming
equal?returns true for identical strings - Confusing output order
- Thinking
==checks object identity
arr1 = [1, 2, 3] arr2 = arr1 arr3 = [1, 2, 3] puts arr1.equal?(arr2) puts arr1.equal?(arr3)What is the output and why?
Solution
Step 1: Analyze
Sincearr1.equal?(arr2)arr2is assigned directly fromarr1, both point to the same object, soequal?returnstrue.Step 2: Analyze
arr1.equal?(arr3)arr3is a new array with the same content but a different object, soequal?returnsfalse.Final Answer:
true false -> Option DQuick Check:
Same object = true, same content but different object = false [OK]
- Assuming arrays with same content are the same object
- Confusing
==withequal? - Thinking assignment creates a new object
x and y refer to the same object, but x might be nil. Which Ruby code safely performs this check without errors?Solution
Step 1: Check safety of
In Ruby,equal?onnilnilis an object and responds toequal?, sox.equal?(y)is safe even ifxisnil. It returnsfalseunlessyis alsonil.Step 2: Eliminate distractors
x&.equal?(y)returnsnilifxisnil, which is not a proper boolean result.y.equals(x)calls a non-existent method.x == ychecks content, not identity.Final Answer:
x.equal?(y) -> Option AQuick Check:
nil.equal?(y)safe boolean check = C [OK]
nil.equal?(other) works without error [OK]- Using
&.which returnsnilinstead of boolean - Calling non-existent
equalsmethod - Using
==which checks content, not identity
Ready to prove it?
Pass the test and this pattern moves unknown
