Permalink
Browse files

don't raise NoMethodError the tried method doesn't exists

  • Loading branch information...
1 parent f674aed commit 29a5aeaae976bf8432d57ec996c7c81932a39de6 @dmathieu dmathieu committed May 21, 2011
@@ -28,6 +28,8 @@ class Object
def try(*a, &b)
if a.empty? && block_given?
yield self
+ elsif !a.empty? && !respond_to?(a.first)
+ nil
else
__send__(*a, &b)
end
@@ -99,7 +99,7 @@ def setup
def test_nonexisting_method
method = :undefined_method
assert !@string.respond_to?(method)
- assert_raise(NoMethodError) { @string.try(method) }
+ assert_nil @string.try(method)
end
def test_valid_method

7 comments on commit 29a5aea

@laserlemon

Could somebody please explain this change?

As I understand it, the purpose of Object#try is to call a method on an object of an expected class, but that could also be nil. In what situation would you want to silently avoid a NoMethodError? If I'm trying a method that doesn't exist in my expected class, I should know about it.

@dmathieu

On STI objects where you might have methods defined for some records, but not for others for example.

@josevalim
Member
@jonleighton
Member

Agreed, I think we should revert this.

@alindeman

-1 to this change as well. It's not acceptable to radically change the behavior at this point.

@josevalim
Member
@arunagw
Member
arunagw commented on 29a5aea Oct 6, 2011

This commit 587dd7d also need to revert the fix the failing test. Or might need a fix!

587dd7d commit is not having test.

Please sign in to comment.