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^^
#####################
From: Kyung won Cheon [mailto:[email protected]]
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