Nested Function Confusion

Hi, couldn’t find any explanation of nested functions (other than an
acknowledgment of their existence) in Programming Ruby or the Ruby
Programming Language, so thought I’d see what people here could tell me.

I’m having a difficult time understanding what is going on in this
def test
def test2

RUBY_VERSION # => “1.8.6”
defined? test # => “method”
defined? test2 # => nil

defined? test::test2 # => “method”
defined? test2 # => “method”

defined? test # => “method”
methods.grep( /test/ ) # => [“test2”]

The first time I check whether test2 is defined, it returns nil, the
time it returns “method”
When I check if test is defined, it returns ‘method’ but when I type
methods.grep(/test/) it only finds “test2”

Also, when should nested functions/methods be used?
Are nested functions redefined upon each call to the outer function?
Are there scope restrictions that would make it sensible to use nested
functions to enforce encapsulation of interdependent logic?


Josh C. wrote:

RUBY_VERSION # => “1.8.6”
time it returns “method”

Ruby doesn’t support defining nested functions like this very well, so I
would say they should never be used, if possible. Instead, use lambdas,
procs, or other closure-like constructs. Try searching for “ruby nested
methods” and you will find past discussions of this.

Nested functions are not really nested, but are flattened into the same
scope. Try running test2, then test1, then test2 again.

Yes, nested functions will be redefined each time the def…end code is
run. You can verify by having two different definitions in an if

Also, defined? is a strange and mystical beast that should probably be