From: Rune Hammersland Date: 2006-10-31T20:37:17+09:00 Subject: Difference between define_method and def method; end Hello dear Rubyists. It was suggested on the IRC channel that I try the ML for this problem ... While looking at how to undefine a method, I found out that there is a difference in how define_method and the def ... end block works. Example coming up: # Two classes to play with. class Parent def lol puts "P: LOL" end end class Child < Parent # Commenting out the redefinition doesn't help def lol puts "C: LOL" end end # test1.rb c = Child.new c.lol # => "C: LOL" or "P: LOL" if commented out Child.class_eval { undef_method :lol } # Try to redefine method and call super. class Child < Parent def lol print "LOL: " begin super rescue NameError => e puts e.to_s end end end c.lol # => "LOL: superclass method `lol' disabled" # Then in test2.rb: c = Child.new c.lol # => "C: LOL", or "P: LOL" if commented out. Child.class_eval { undef_method :lol } # Try to redefine method and call super. Child.class_eval do define_method(:lol) { print "LOL: "; super } end c.lol # => "LOL: P: LOL" Now ... Why can I call super in the redefinition of the method using define_method, and not using the def ... end block? For me this seems like an inconsistency. First I thought it was neat that I could not call super in the method after using undef_method and redefining it again, but then I found out I could using define_method. As the comments state, I also tried to run the code with the redefinition of the lol method in the Child class, but to no help. The output is roughly the same (P instead of C obviously). Anybody care to shed a little light on this? -- Vennlig Hilsen Rune Hammersland