Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Overriding the == operator in Ruby

According to the docs, Array.include? uses the == comparison on objects. I come from Java where such things are (usually) done with .equals() which is easy to override for a particular object.

How can I override == in Ruby to allow me to specify the behaviour of Array.include? for my particular object?

like image 230
lynks Avatar asked Jun 25 '12 09:06

lynks


People also ask

Does ruby have operator overloading?

Ruby permits operator overloading, allowing one to define how an operator shall be used in a particular program. For example a '+' operator can be define in such a way to perform subtraction instead addition and vice versa.

What is the name of this operator === in Ruby?

Triple Equals Operator (More Than Equality) Our last operator today is going to be about the triple equals operator ( === ). This one is also a method, and it appears even in places where you wouldn't expect it to. Ruby is calling the === method here on the class.

Can we override == operator in Java?

You cannot override operators in Java. That's one of the reasons why any nontrival math (especially geometric) operations should not be implemented in Java (the Point class above is kind of such a class, if you want it to do some real work, for example a line-line intersection, you'd better do it in C++).


2 Answers

In Ruby == is just a method (with some syntax sugar on top allowing you to write foo == bar instead of foo.==(bar)) and you override == just like you would any other method:

class MyClass   def ==(other_object)     # return true if self is equal to other_object, false otherwise   end end 
like image 65
sepp2k Avatar answered Oct 02 '22 08:10

sepp2k


As described above, == is a method in Ruby and can be overridden. You code a custom equality condition in the method. For example:

class Person   attr_reader :name, :gender, :social_id   attr_accessor :age    def initialize(name, age, gender, social_id)     self.name = name     self.age = age.to_i     self.gender = gender     self.social_id = social_id   end    def ==(other)     social_id == other.social_id   end end 

You don't need to override other methods any more.

like image 37
Eric Andrews Avatar answered Oct 02 '22 06:10

Eric Andrews