Skip to content

Instantly share code, notes, and snippets.

@tenderlove
Created May 6, 2012 00:48
Show Gist options
  • Save tenderlove/2606646 to your computer and use it in GitHub Desktop.
Save tenderlove/2606646 to your computer and use it in GitHub Desktop.
diff --git a/lib/delegate.rb b/lib/delegate.rb
index 863c63f..a09fcf9 100644
--- a/lib/delegate.rb
+++ b/lib/delegate.rb
@@ -122,6 +122,22 @@ class Delegator < BasicObject
self.__getobj__ == obj
end
+ def eql?(obj)
+ if obj.equal? self
+ __getobj__.eql? obj.__getobj__
+ else
+ __getobj__.eql?(obj)
+ end
+ end
+
+ def <=>(obj)
+ if obj.equal? self
+ __getobj__ <=> obj.__getobj__
+ else
+ __getobj__ <=> obj
+ end
+ end
+
#
# Returns true if two objects are not considered of equal value.
#
diff --git a/test/test_delegate.rb b/test/test_delegate.rb
index a09451b..aec52fb 100644
--- a/test/test_delegate.rb
+++ b/test/test_delegate.rb
@@ -134,3 +134,38 @@ class TestDelegateClass < Test::Unit::TestCase
assert_raise(NoMethodError, '[ruby-dev:40314]#5') {d.send(:delegate_test_private)}
end
end
+
+class WidgetWrapperTests < MiniTest::Unit::TestCase
+ class Widget
+ end
+
+ class WidgetWrapper < DelegateClass(Widget)
+ end
+
+ attr_reader :widget, :wrapper
+
+ def setup
+ @widget = Widget.new
+ @wrapper = WidgetWrapper.new @widget
+ end
+
+ def test_equal_operator
+ assert_equal(widget == widget, wrapper == wrapper)
+ end
+
+ def test_equal
+ assert_equal(widget.equal?(widget), wrapper.equal?(wrapper))
+ end
+
+ def test_comparison
+ assert_equal(widget <=> widget, wrapper <=> wrapper)
+ end
+
+ def test_eql
+ assert_equal(widget.eql?(widget), wrapper.eql?(wrapper))
+ end
+
+ def test_hash
+ assert_equal(widget.hash, wrapper.hash)
+ end
+end
@knu
Copy link

knu commented May 6, 2012

If you define eql?, hash needs to be defined so they work as one.

@tenderlove
Copy link
Author

Nice catch, you're right. I'll update my patch. :-)

@tenderlove
Copy link
Author

Interesting. I've updated my patch, and hash seems to behave as expected.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment