Method def in method vs method def in block

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