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
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
p a.respond_to?(:ccc) # => true
a.ccc
p A.public_instance_methods.grep(/ccc/) # => []
a2.ccc rescue puts $! # undefined method
···
#####################
# What's the diff ??
# Help Me^^
#####################
--
Posted via http://www.ruby-forum.com/.
# class A
# def aaa
# puts "called aaa by #{self}"
# def bbb
# puts "called bbb by #{self}"
# end
# end
# end
···
From: Kyung won Cheon [mailto:kdream95@gmerce.co.kr]
#
# 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