respond_to? and protected methods

Posted by mlomnicki on Stack Overflow See other posts from Stack Overflow or by mlomnicki
Published on 2010-04-02T22:18:50Z Indexed on 2010/04/02 22:23 UTC
Read the original article Hit count: 212

Filed under:
|

It may not be so obvious how respond_to? works in ruby. Consider that:


class A

   def public_method
   end

   protected
   def protected_method
   end

   private
   def private_method
   end

end

obj = A.new
obj.respond_to?(:public_method)
# true - that's pretty obvious
obj.respond_to?(:private_method)
# false - as expected
obj.respond_to?(:protected_method)
# true - WTF?

So if 'obj' responds to protected_method we should expect

obj.protected_method

not to raise an exception, shouldn't we?

...but it raises obviously

Documentation points that calling respond_to? with 2nd argument set to true check private method as well

obj.respond_to?(:private_method, true)
# true

And that's far more reasonable

So the question is how to check if object responds to public method only? Is there a solution better than that?

obj.methods.include?(:public_method)
# true
obj.methods.include?(:protected_method)
# false

© Stack Overflow or respective owner

Related posts about ruby

Related posts about encapsulation