From: Robert Klemme Date: 2007-06-02T04:45:20+09:00 Subject: Re: nested methods don't really exist?! On 01.06.2007 14:36, Artur Merke wrote: > Hi, > > I've just encountered somehow strange (for me) behavior of nested > methods in ruby: > > class A > def a > def b > print "bbb" > end > end > > def c > b > end > end > > irb(main):013:0> A.new.c > bbb=> nil > > class A > def b > print "BBB" > end > end > irb(main):019:0> A.new.c > BBB=> nil > > my first thought was that method/function 'b' would be local to > method 'a' in class A (like it would be in Pascal). But this is of > course not > the case, as the above example shows. > > Is suppose that method 'a' (re)defines method 'b' every time it is > called, therefore using nested methods doesn't seem to be a > good idea in ruby (better readability but much worse performance, esp. > when 'b' isn't a oneliner) > > > any comments? You're right on. I think that nested methods are a bad thing to have especially since invocation of an instance method has side effects on all instances: irb(main):001:0> class Foo irb(main):002:1> def a irb(main):003:2> def b; 1; end irb(main):004:2> 2 irb(main):005:2> end irb(main):006:1> end => nil irb(main):007:0> f=Foo.new => # irb(main):008:0> f.b rescue "no" => "no" irb(main):009:0> f.a => 2 irb(main):010:0> f.b rescue "no" => 1 irb(main):011:0> irb(main):012:0* Foo.new.b rescue "no" => 1 irb(main):013:0> #b is defined only after #a has been invoked at least once. I cannot think of a scenario where you would want this behavior. Kind regards robert