From: "Peña, Botp" Date: 2008-11-21T18:31:15+09:00 Subject: Re: method def in method vs method def in block From: Kyung won Cheon [mailto:kdream95@gmerce.co.kr] # class A # def aaa # puts "called aaa by #{self}" # def bbb # puts "called bbb by #{self}" # end # end # end # # a = A.new # p a.respond_to?(:bbb) # => false # a.aaa # p a.respond_to?(:bbb) # => true # a.bbb this is faq. you defined bbb inside aaa, ergo, it will be "defined" until aaa is called, ie you have to call aaa first (just one call will do). # p A.public_instance_methods.grep(/bbb/) # => ["bbb"] # # a2 = A.new # a2.bbb # # p a.respond_to?(:ccc) # => false # # a.instance_eval do # def ccc # puts "called ccc by #{self}" # end # end you defined a method "ccc" *only* for the object instance "a", not all the instances of A. try module_eval or class_eval. A.module_eval do def ccc puts "called ccc by #{self}" end end # p a.respond_to?(:ccc) # => true # a.ccc # # p A.public_instance_methods.grep(/ccc/) # => [] # # a2.ccc rescue puts $! # undefined method