From: "mame (Yusuke Endoh)" Date: 2012-11-03T12:25:38+09:00 Subject: [ruby-core:48789] [ruby-trunk - Bug #6832][Assigned] Module#instance_method and Module#method_defined? act inconsistently w.r.t #respond_to_missing? Issue #6832 has been updated by mame (Yusuke Endoh). Status changed from Open to Assigned Assignee set to matz (Yukihiro Matsumoto) Target version set to 2.0.0 Let me summarize: class Foo def method_missing(name, *args) return super unless name =~ /^foo_/ puts name end def respond_to_missing?(name, include_private) super || name =~ /^foo_/ end end Foo.new.method(:foo_bar).call #=> "foo_bar" (as expected) p Foo.method_defined?(:foo_bar) #=> true expected, but actual false p Foo.instance_method(:foo_bar) #=> UnboundMethod expected, but actual NameError Matz, is this an intended behavior? -- Yusuke Endoh ---------------------------------------- Bug #6832: Module#instance_method and Module#method_defined? act inconsistently w.r.t #respond_to_missing? https://bugs.ruby-lang.org/issues/6832#change-32279 Author: myronmarston (Myron Marston) Status: Assigned Priority: Normal Assignee: matz (Yukihiro Matsumoto) Category: Target version: 2.0.0 ruby -v: 1.9.3p194 It's awesome that #respond_to_missing? allows Object#method to work for messages handled by #method_missing. However, I was surprised to discover that Module#instance_method and Module#method_defined? don't similarly take #respond_to_missing? into account. It seems very inconsistent. Here's the behavior I'm seeing: https://gist.github.com/3255162 In this example, I would expect Foo#method_defined?(:foo_bar) to return true, and I would expect Foo#instance_method(:foo_bar) to return an UnboundMethod that, when bound to a Foo instance, would use #method_missing to perform the method. -- http://bugs.ruby-lang.org/