We use object identity to check if two things are exactly the same object or just look alike. This helps avoid confusion when working with data.
Object identity (equal? vs ==) in Ruby
object1.equal?(object2) object1 == object2
equal? checks if both variables point to the exact same object.
== checks if the content or value of two objects is the same.
a and b point to the same string object, so equal? is true.a = "hello" b = a puts a.equal?(b) # true puts a == b # true
a and b have the same content but are different objects, so equal? is false but == is true.a = "hello" b = "hello" puts a.equal?(b) # false puts a == b # true
equal? can be true. But == always checks value equality.a = 100 b = 100 puts a.equal?(b) # true or false depends on Ruby version puts a == b # true
This program shows the difference between equal? and == with strings. a and b are the same object, but c is a different object with the same content.
a = "cat" b = a c = "cat" puts "a.equal?(b): #{a.equal?(b)}" puts "a == b: #{a == b}" puts "a.equal?(c): #{a.equal?(c)}" puts "a == c: #{a == c}"
Use equal? when you want to check if two variables are exactly the same object.
Use == when you want to check if two objects have the same value or content.
Remember that some objects like numbers or symbols may behave differently with equal? because Ruby can reuse them.
equal? checks if two variables point to the same object.
== checks if two objects have the same content.
Knowing the difference helps avoid bugs and understand how Ruby handles objects.
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
