# Object equality

**URL:** <https://www.ruby-forum.com/t/object-equality/194708>\
**Category:** IronRuby\
**Created:** [September 9, 2010, 10:33am UTC](https://www.ruby-forum.com/t/object-equality/194708 "2010-09-09T10:33:59Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![Davy\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/7ba0ec/32.png) [@Davy\_B](https://www.ruby-forum.com/u/Davy_B)\
**Post date:** [September 9, 2010, 10:33am UTC](https://www.ruby-forum.com/t/object-equality/194708/1 "2010-09-09T10:33:59Z")

</div>

If i have the following class in ruby:

class TestClass  
def initialize(value)  
@value = value  
end

def ==(other)  
return false if other.nil?  
self.value == other.value  
end

protected

def value  
@value  
end  
end

test1 = TestClass.new(5)  
test2 = TestClass.new(5)  
p test1 == test2  
p test1 != test2

the output is:  
true  
false

if i do this in .NET:

dynamic test1 = ruby.TestClass.@new(5);  
dynamic test2 = ruby.TestClass.@new(5);

var equals = test1 == test2;  
var differs = test1 != test2;

both equals and differs are true

i’m going to create an issue about this, but i do need to get this  
working… is there a temporary workaround that i can use for now?

---

<div class="post-metadata">

**Author:** ![Davy\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/7ba0ec/32.png) [@Davy\_B](https://www.ruby-forum.com/u/Davy_B)\
**Post date:** [September 9, 2010, 12:21pm UTC](https://www.ruby-forum.com/t/object-equality/194708/2 "2010-09-09T12:21:41Z")

</div>

Testing for object equality in C# is different than it is in Ruby. In  
C#, you need to override both Object.Equals and Object.GetHashCode (I  
forget which is used when, but I do recall that the compiler complains  
if you override one and not the other). So, when you bring your Ruby  
object into C# and compare them, C# doesn’t see an override for Equals  
on your object, and thus uses Object.Equals (which is often what you  
don’t want). Try defining an equals method on your Ruby object, or  
alias it to ==.

I suspect that the == method on your Ruby object does not map to  
Equals when you bring into C#. And I’m not sure that it should.

Thoughts?

–  
Will G.  
[http://hotgazpacho.org/](http://hotgazpacho.org/)

---

<div class="post-metadata">

**Author:** ![Davy\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/7ba0ec/32.png) [@Davy\_B](https://www.ruby-forum.com/u/Davy_B)\
**Post date:** [September 9, 2010, 12:53pm UTC](https://www.ruby-forum.com/t/object-equality/194708/3 "2010-09-09T12:53:18Z")

</div>

the problem isn’t with checking wether 2 objects are equal (though you  
indeed need to define an Equals method on your ruby object if you want  
the  
comparison to work with a direct call to .Equals… doing == in C#  
definitely uses the == method of your ruby object) but it is with the !=  
check. In ruby, using != calls == and inverts the result of that.  
Doing !=  
in C# on a ruby object doesn’t seem to do the same thing.

I’m also not entirely sure how it _should_ be… but as far as i can  
tell,  
right now, i can’t get equality checks working properly with ruby  
objects.

if a == b is true, then a != b should always be false  
if a.Equals(b) is true, then !a.Equals(b) should always be false

if there’s another way to get this behavior working in C# for ruby  
objects,  
i’d love to hear about it since it’s pretty important for something i’m  
trying to do 🙂

---

<div class="post-metadata">

**Author:** ![Davy\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/7ba0ec/32.png) [@Davy\_B](https://www.ruby-forum.com/u/Davy_B)\
**Post date:** [September 9, 2010, 1:10pm UTC](https://www.ruby-forum.com/t/object-equality/194708/4 "2010-09-09T13:10:52Z")

</div>

Then it would appear that in C#, using the != operator on two instances  
of  
Ruby objects does not call the == method on the first Ruby object and  
invert  
the result.

Can you switch to using equals as a work-around?

Not sure of the semantics around == vs .Equals in C#, but I know there  
is a  
semantic difference between == and eql? in Ruby.

–  
Will G.  
[http://hotgazpacho.org/](http://hotgazpacho.org/)

On Sep 9, 2010, at 6:52 AM, Davy B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

the problem isn’t with checking wether 2 objects are equal (though you  
indeed need to define an Equals method on your ruby object if you want  
the  
comparison to work with a direct call to .Equals… doing == in C#  
definitely uses the == method of your ruby object) but it is with the !=  
check. In ruby, using != calls == and inverts the result of that.  
Doing !=  
in C# on a ruby object doesn’t seem to do the same thing.

I’m also not entirely sure how it _should_ be… but as far as i can  
tell,  
right now, i can’t get equality checks working properly with ruby  
objects.

if a == b is true, then a != b should always be false  
if a.Equals(b) is true, then !a.Equals(b) should always be false

if there’s another way to get this behavior working in C# for ruby  
objects,  
i’d love to hear about it since it’s pretty important for something i’m  
trying to do 🙂

---

<div class="post-metadata">

**Author:** ![Davy\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/7ba0ec/32.png) [@Davy\_B](https://www.ruby-forum.com/u/Davy_B)\
**Post date:** [September 9, 2010, 1:46pm UTC](https://www.ruby-forum.com/t/object-equality/194708/5 "2010-09-09T13:46:00Z")

</div>

On Thu, Sep 9, 2010 at 1:44 PM, Davy B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> defining an Equals method on the ruby class which delegates to == works,  
> but it is somewhat weird since most people use the == and != operators to  
> check for equality.
> 
> perhaps i’m better off getting rid of the == implementation and solely  
> providing an Equals implementation

though the downside of that is that the ruby class doesn’t stick to  
ruby’s  
idioms when it comes to equality checks, which hurts its usage from  
other  
ruby code :s

---

<div class="post-metadata">

**Author:** ![Davy\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/7ba0ec/32.png) [@Davy\_B](https://www.ruby-forum.com/u/Davy_B)\
**Post date:** [September 9, 2010, 1:44pm UTC](https://www.ruby-forum.com/t/object-equality/194708/6 "2010-09-09T13:44:50Z")

</div>

by default, == does a reference check in C#, unless you override it to  
do a  
value based check (which you typically implement in Equals)

in C#, if you want == and != to work properly you need to implement them  
both. In ruby, you obviously can’t implement !=, but i had (naievely  
perhaps) expected that IronRuby would preserve the Ruby behavior when  
calling == on an object which implements it. I _think_ that would be  
the  
best way to handle this, though there might be very valid reasons as to  
why  
this isn’t the case at the moment.

defining an Equals method on the ruby class which delegates to == works,  
but  
it is somewhat weird since most people use the == and != operators to  
check  
for equality.

perhaps i’m better off getting rid of the == implementation and solely  
providing an Equals implementation

---

<div class="post-metadata">

**Author:** ![Davy\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/7ba0ec/32.png) [@Davy\_B](https://www.ruby-forum.com/u/Davy_B)\
**Post date:** [September 10, 2010, 7:10am UTC](https://www.ruby-forum.com/t/object-equality/194708/7 "2010-09-10T07:10:33Z")

</div>

If any of the operands of == or != are typed to dynamic C# emits a call  
to dynamic site with the corresponding operation. If the left hand side  
is a Ruby object then this dynamic operation is translated to a Ruby  
method call â€œ==â€ or â€œ!=â€, respectively.  
The latest version of IronRuby (built from github sources) is compatible  
with MRI 1.9.2 in the way â€œ!=â€ method is implemented: BasicObject#!=  
calls == and negates the result. You can also provide your own  
implementation of != method if its behavior should be different. This  
semantics is compatible with DLR dynamic operations and everything works  
as expected:

dynamic equatable = Engine.Execute(@"  
class RubyEquatable  
def initialize val  
@val = val  
end

```
def ==(other)
  @val == other
end

```

end

RubyEquatable.new(100)  
");

Assert((bool)( equatable == 100));  
Assert(!(bool)( equatable == 101));  
Assert(!(bool)( equatable != 100));  
Assert((bool)( equatable != 100));

Tomas

From: [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)] On Behalf Of Davy B.  
Sent: Thursday, September 09, 2010 4:46 AM  
To: [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
Subject: Re: [Ironruby-core] object equality

On Thu, Sep 9, 2010 at 1:44 PM, Davy B.  
\<[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)\> wrote:  
by default, == does a reference check in C#, unless you override it to  
do a value based check (which you typically implement in Equals)

in C#, if you want == and != to work properly you need to implement them  
both. In ruby, you obviously can’t implement !=, but i had (naievely  
perhaps) expected that IronRuby would preserve the Ruby behavior when  
calling == on an object which implements it. I _think_ that would be  
the best way to handle this, though there might be very valid reasons as  
to why this isn’t the case at the moment.

defining an Equals method on the ruby class which delegates to == works,  
but it is somewhat weird since most people use the == and != operators  
to check for equality.

perhaps i’m better off getting rid of the == implementation and solely  
providing an Equals implementation

though the downside of that is that the ruby class doesn’t stick to  
ruby’s idioms when it comes to equality checks, which hurts its usage  
from other ruby code :s

On Thu, Sep 9, 2010 at 1:10 PM, William Green  
\<[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)\> wrote:  
Then it would appear that in C#, using the != operator on two instances  
of Ruby objects does not call the == method on the first Ruby object and  
invert the result.

Can you switch to using equals as a work-around?

Not sure of the semantics around == vs .Equals in C#, but I know there  
is a semantic difference between == and eql? in Ruby.

–  
Will G.

> **[hotgazpacho](http://hotgazpacho.org/)**

On Sep 9, 2010, at 6:52 AM, Davy B.  
\<[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)\> wrote:  
the problem isn’t with checking wether 2 objects are equal (though you  
indeed need to define an Equals method on your ruby object if you want  
the comparison to work with a direct call to .Equals… doing == in C#  
definitely uses the == method of your ruby object) but it is with the !=  
check. In ruby, using != calls == and inverts the result of that.  
Doing != in C# on a ruby object doesn’t seem to do the same thing.

I’m also not entirely sure how it _should_ be… but as far as i can  
tell, right now, i can’t get equality checks working properly with ruby  
objects.

if a == b is true, then a != b should always be false  
if a.Equals(b) is true, then !a.Equals(b) should always be false

if there’s another way to get this behavior working in C# for ruby  
objects, i’d love to hear about it since it’s pretty important for  
something i’m trying to do 🙂  
On Thu, Sep 9, 2010 at 12:20 PM, William Green  
\<[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)\> wrote:  
Testing for object equality in C# is different than it is in Ruby. In  
C#, you need to override both Object.Equals and Object.GetHashCode (I  
forget which is used when, but I do recall that the compiler complains  
if you override one and not the other). So, when you bring your Ruby  
object into C# and compare them, C# doesn’t see an override for Equals  
on your object, and thus uses Object.Equals (which is often what you  
don’t want). Try defining an equals method on your Ruby object, or  
alias it to ==.

I suspect that the == method on your Ruby object does not map to  
Equals when you bring into C#. And I’m not sure that it should.

Thoughts?

–  
Will G.

> **[hotgazpacho](http://hotgazpacho.org/)**

On Sep 9, 2010, at 4:33 AM, Davy B.  
\<[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)\> wrote:

> end  
> p test1 == test2
> 
> var equals = test1 == test2;  
> var differs = test1 != test2;
> 
> both equals and differs are true
> 
> i’m going to create an issue about this, but i do need to get this working… is there a temporary workaround that i can use for now?
> 
> * * *
> 
> Ironruby-core mailing list  
> [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> [http://rubyforge.org/mailman/listinfo/ironruby-core](http://rubyforge.org/mailman/listinfo/ironruby-core)

* * *

Ironruby-core mailing list  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[http://rubyforge.org/mailman/listinfo/ironruby-core](http://rubyforge.org/mailman/listinfo/ironruby-core)

* * *

Ironruby-core mailing list  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[http://rubyforge.org/mailman/listinfo/ironruby-core](http://rubyforge.org/mailman/listinfo/ironruby-core)

* * *

Ironruby-core mailing list  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[http://rubyforge.org/mailman/listinfo/ironruby-core](http://rubyforge.org/mailman/listinfo/ironruby-core)

---

<div class="post-metadata">

**Author:** ![Davy\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/7ba0ec/32.png) [@Davy\_B](https://www.ruby-forum.com/u/Davy_B)\
**Post date:** [September 10, 2010, 9:49am UTC](https://www.ruby-forum.com/t/object-equality/194708/8 "2010-09-10T09:49:45Z")

</div>

great to hear, and already looking forward to the next release 🙂

just wondering though, you mentioned that it’s possible to provide your  
own  
implementation of !=. how would one do that? if i try to define a !=  
method, i get an ‘unexpected !=’ error

On Fri, Sep 10, 2010 at 7:09 AM, Tomas M. \<

---

<div class="post-metadata">

**Author:** ![Davy\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/7ba0ec/32.png) [@Davy\_B](https://www.ruby-forum.com/u/Davy_B)\
**Post date:** [September 10, 2010, 7:11am UTC](https://www.ruby-forum.com/t/object-equality/194708/9 "2010-09-10T07:11:43Z")

</div>

There is indeed a typoâ€¦ the last line should read:  
Assert((bool)( equatable != 101));

Tomas

From: Tomas M.  
Sent: Thursday, September 09, 2010 10:10 PM  
To: [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
Subject: RE: [Ironruby-core] object equality

If any of the operands of == or != are typed to dynamic C# emits a call  
to dynamic site with the corresponding operation. If the left hand side  
is a Ruby object then this dynamic operation is translated to a Ruby  
method call â€œ==â€ or â€œ!=â€, respectively.  
The latest version of IronRuby (built from github sources) is compatible  
with MRI 1.9.2 in the way â€œ!=â€ method is implemented: BasicObject#!=  
calls == and negates the result. You can also provide your own  
implementation of != method if its behavior should be different. This  
semantics is compatible with DLR dynamic operations and everything works  
as expected:

dynamic equatable = Engine.Execute(@"  
class RubyEquatable  
def initialize val  
@val = val  
end

```
def ==(other)
  @val == other
end

```

end

RubyEquatable.new(100)  
");

Assert((bool)( equatable == 100));  
Assert(!(bool)( equatable == 101));  
Assert(!(bool)( equatable != 100));  
Assert((bool)( equatable != 100));

Tomas

From: [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)] On Behalf Of Davy B.  
Sent: Thursday, September 09, 2010 4:46 AM  
To: [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
Subject: Re: [Ironruby-core] object equality

On Thu, Sep 9, 2010 at 1:44 PM, Davy B.  
\<[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)\> wrote:  
by default, == does a reference check in C#, unless you override it to  
do a value based check (which you typically implement in Equals)

in C#, if you want == and != to work properly you need to implement them  
both. In ruby, you obviously can’t implement !=, but i had (naievely  
perhaps) expected that IronRuby would preserve the Ruby behavior when  
calling == on an object which implements it. I _think_ that would be  
the best way to handle this, though there might be very valid reasons as  
to why this isn’t the case at the moment.

defining an Equals method on the ruby class which delegates to == works,  
but it is somewhat weird since most people use the == and != operators  
to check for equality.

perhaps i’m better off getting rid of the == implementation and solely  
providing an Equals implementation

though the downside of that is that the ruby class doesn’t stick to  
ruby’s idioms when it comes to equality checks, which hurts its usage  
from other ruby code :s

On Thu, Sep 9, 2010 at 1:10 PM, William Green  
\<[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)\> wrote:  
Then it would appear that in C#, using the != operator on two instances  
of Ruby objects does not call the == method on the first Ruby object and  
invert the result.

Can you switch to using equals as a work-around?

Not sure of the semantics around == vs .Equals in C#, but I know there  
is a semantic difference between == and eql? in Ruby.

–  
Will G.

> **[hotgazpacho](http://hotgazpacho.org/)**

On Sep 9, 2010, at 6:52 AM, Davy B.  
\<[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)\> wrote:  
the problem isn’t with checking wether 2 objects are equal (though you  
indeed need to define an Equals method on your ruby object if you want  
the comparison to work with a direct call to .Equals… doing == in C#  
definitely uses the == method of your ruby object) but it is with the !=  
check. In ruby, using != calls == and inverts the result of that.  
Doing != in C# on a ruby object doesn’t seem to do the same thing.

I’m also not entirely sure how it _should_ be… but as far as i can  
tell, right now, i can’t get equality checks working properly with ruby  
objects.

if a == b is true, then a != b should always be false  
if a.Equals(b) is true, then !a.Equals(b) should always be false

if there’s another way to get this behavior working in C# for ruby  
objects, i’d love to hear about it since it’s pretty important for  
something i’m trying to do 🙂  
On Thu, Sep 9, 2010 at 12:20 PM, William Green  
\<[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)\> wrote:  
Testing for object equality in C# is different than it is in Ruby. In  
C#, you need to override both Object.Equals and Object.GetHashCode (I  
forget which is used when, but I do recall that the compiler complains  
if you override one and not the other). So, when you bring your Ruby  
object into C# and compare them, C# doesn’t see an override for Equals  
on your object, and thus uses Object.Equals (which is often what you  
don’t want). Try defining an equals method on your Ruby object, or  
alias it to ==.

I suspect that the == method on your Ruby object does not map to  
Equals when you bring into C#. And I’m not sure that it should.

Thoughts?

–  
Will G.

> **[hotgazpacho](http://hotgazpacho.org/)**

On Sep 9, 2010, at 4:33 AM, Davy B.  
\<[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)\> wrote:

> end  
> p test1 == test2
> 
> var equals = test1 == test2;  
> var differs = test1 != test2;
> 
> both equals and differs are true
> 
> i’m going to create an issue about this, but i do need to get this working… is there a temporary workaround that i can use for now?
> 
> * * *
> 
> Ironruby-core mailing list  
> [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> [http://rubyforge.org/mailman/listinfo/ironruby-core](http://rubyforge.org/mailman/listinfo/ironruby-core)

* * *

Ironruby-core mailing list  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[http://rubyforge.org/mailman/listinfo/ironruby-core](http://rubyforge.org/mailman/listinfo/ironruby-core)

* * *

Ironruby-core mailing list  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[http://rubyforge.org/mailman/listinfo/ironruby-core](http://rubyforge.org/mailman/listinfo/ironruby-core)

* * *

Ironruby-core mailing list  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[http://rubyforge.org/mailman/listinfo/ironruby-core](http://rubyforge.org/mailman/listinfo/ironruby-core)

---

<div class="post-metadata">

**Author:** ![Davy\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/7ba0ec/32.png) [@Davy\_B](https://www.ruby-forum.com/u/Davy_B)\
**Post date:** [September 10, 2010, 6:43pm UTC](https://www.ruby-forum.com/t/object-equality/194708/10 "2010-09-10T18:43:42Z")

</div>

You need MRI 1.9.\* or IronRuby built from github sources.  
Then this just works

def !=(other)  
end

Tomas

From: [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)] On Behalf Of Davy B.  
Sent: Friday, September 10, 2010 12:46 AM  
To: [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
Subject: Re: [Ironruby-core] object equality

great to hear, and already looking forward to the next release 🙂

just wondering though, you mentioned that it’s possible to provide your  
own implementation of !=. how would one do that? if i try to define a  
!= method, i get an ‘unexpected !=’ error  
On Fri, Sep 10, 2010 at 7:09 AM, Tomas M.  
\<[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)\>  
wrote:  
If any of the operands of == or != are typed to dynamic C# emits a call  
to dynamic site with the corresponding operation. If the left hand side  
is a Ruby object then this dynamic operation is translated to a Ruby  
method call â€œ==â€ or â€œ!=â€, respectively.  
The latest version of IronRuby (built from github sources) is compatible  
with MRI 1.9.2 in the way â€œ!=â€ method is implemented: BasicObject#!=  
calls == and negates the result. You can also provide your own  
implementation of != method if its behavior should be different. This  
semantics is compatible with DLR dynamic operations and everything works  
as expected:

dynamic equatable = Engine.Execute(@"  
class RubyEquatable  
def initialize val  
@val = val  
end

```
def ==(other)
  @val == other
end

```

end

RubyEquatable.new(100)  
");

Assert((bool)( equatable == 100));  
Assert(!(bool)( equatable == 101));  
Assert(!(bool)( equatable != 100));  
Assert((bool)( equatable != 100));

Tomas

From:  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)]  
On Behalf Of Davy B.  
Sent: Thursday, September 09, 2010 4:46 AM  
To: [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
Subject: Re: [Ironruby-core] object equality

On Thu, Sep 9, 2010 at 1:44 PM, Davy B.  
\<[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)\> wrote:  
by default, == does a reference check in C#, unless you override it to  
do a value based check (which you typically implement in Equals)

in C#, if you want == and != to work properly you need to implement them  
both. In ruby, you obviously can’t implement !=, but i had (naievely  
perhaps) expected that IronRuby would preserve the Ruby behavior when  
calling == on an object which implements it. I _think_ that would be  
the best way to handle this, though there might be very valid reasons as  
to why this isn’t the case at the moment.

defining an Equals method on the ruby class which delegates to == works,  
but it is somewhat weird since most people use the == and != operators  
to check for equality.

perhaps i’m better off getting rid of the == implementation and solely  
providing an Equals implementation

though the downside of that is that the ruby class doesn’t stick to  
ruby’s idioms when it comes to equality checks, which hurts its usage  
from other ruby code :s

On Thu, Sep 9, 2010 at 1:10 PM, William Green  
\<[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)\> wrote:  
Then it would appear that in C#, using the != operator on two instances  
of Ruby objects does not call the == method on the first Ruby object and  
invert the result.

Can you switch to using equals as a work-around?

Not sure of the semantics around == vs .Equals in C#, but I know there  
is a semantic difference between == and eql? in Ruby.

–  
Will G.

> **[hotgazpacho](http://hotgazpacho.org/)**

On Sep 9, 2010, at 6:52 AM, Davy B.  
\<[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)\> wrote:  
the problem isn’t with checking wether 2 objects are equal (though you  
indeed need to define an Equals method on your ruby object if you want  
the comparison to work with a direct call to .Equals… doing == in C#  
definitely uses the == method of your ruby object) but it is with the !=  
check. In ruby, using != calls == and inverts the result of that.  
Doing != in C# on a ruby object doesn’t seem to do the same thing.

I’m also not entirely sure how it _should_ be… but as far as i can  
tell, right now, i can’t get equality checks working properly with ruby  
objects.

if a == b is true, then a != b should always be false  
if a.Equals(b) is true, then !a.Equals(b) should always be false

if there’s another way to get this behavior working in C# for ruby  
objects, i’d love to hear about it since it’s pretty important for  
something i’m trying to do 🙂  
On Thu, Sep 9, 2010 at 12:20 PM, William Green  
\<[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)\> wrote:  
Testing for object equality in C# is different than it is in Ruby. In  
C#, you need to override both Object.Equals and Object.GetHashCode (I  
forget which is used when, but I do recall that the compiler complains  
if you override one and not the other). So, when you bring your Ruby  
object into C# and compare them, C# doesn’t see an override for Equals  
on your object, and thus uses Object.Equals (which is often what you  
don’t want). Try defining an equals method on your Ruby object, or  
alias it to ==.

I suspect that the == method on your Ruby object does not map to  
Equals when you bring into C#. And I’m not sure that it should.

Thoughts?

–  
Will G.

> **[hotgazpacho](http://hotgazpacho.org/)**

On Sep 9, 2010, at 4:33 AM, Davy B.  
\<[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)\> wrote:

> end  
> p test1 == test2
> 
> var equals = test1 == test2;  
> var differs = test1 != test2;
> 
> both equals and differs are true
> 
> i’m going to create an issue about this, but i do need to get this working… is there a temporary workaround that i can use for now?
> 
> * * *
> 
> Ironruby-core mailing list  
> [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> [http://rubyforge.org/mailman/listinfo/ironruby-core](http://rubyforge.org/mailman/listinfo/ironruby-core)

* * *

Ironruby-core mailing list  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[http://rubyforge.org/mailman/listinfo/ironruby-core](http://rubyforge.org/mailman/listinfo/ironruby-core)

* * *

Ironruby-core mailing list  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[http://rubyforge.org/mailman/listinfo/ironruby-core](http://rubyforge.org/mailman/listinfo/ironruby-core)

* * *

Ironruby-core mailing list  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[http://rubyforge.org/mailman/listinfo/ironruby-core](http://rubyforge.org/mailman/listinfo/ironruby-core)

* * *

Ironruby-core mailing list  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[http://rubyforge.org/mailman/listinfo/ironruby-core](http://rubyforge.org/mailman/listinfo/ironruby-core)
