Forum: Ruby nested methods

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
7stud -. (Guest)
on 2009-03-20 12:25
Hi,

This example is from pickaxe2(I can't find the page):

def toggle

  def toggle
    puts "subsequent"
  end

  puts "first"
end

toggle
toggle
toggle

--output:--
first
subsequent
subsequent


Can someone explain why the nested method hides the outer method?

Thanks.
James C. (Guest)
on 2009-03-20 12:31
(Received via mailing list)
2009/3/20 7stud -- <removed_email_address@domain.invalid>

>  puts "first"
>
>
> Can someone explain why the nested method hides the outer method?


The first call redefines toggle on the current object (which here seems
to
be the global main object) and then returns "first". After this, toggle
has
been replaced by the inner method so it returns "subsequent" for all
further
calls.
Leo (Guest)
on 2009-03-20 13:21
(Received via mailing list)
> Can someone explain why the nested method hides the outer method?

There are no nested methods in ruby (similar to smalltalk, eiffel,
java and unlike scheme, python etc.).
James C. (Guest)
on 2009-03-20 13:30
(Received via mailing list)
2009/3/20 Leo <removed_email_address@domain.invalid>

> > Can someone explain why the nested method hides the outer method?
>
> There are no nested methods in ruby (similar to smalltalk, eiffel,
> java and unlike scheme, python etc.).


This statement could confuse people given the above. Clearly you can
define
methods inside other methods, the point is that the 'inner' method is
not
local to the outer one. The inner one becomes defined in the same scope
as
the outer one, and does not remember the environment it was created in.
Methods are not closures, unlike blocks/procs/lambdas.
Brian A. (Guest)
on 2009-03-20 14:15
(Received via mailing list)
James C. <removed_email_address@domain.invalid> writes:

> This statement could confuse people given the above. Clearly you can define
> methods inside other methods, the point is that the 'inner' method is not
> local to the outer one. The inner one becomes defined in the same scope as
> the outer one,

Isn't being defined in the same scope the antithesis of nesting?
James C. (Guest)
on 2009-03-20 14:22
(Received via mailing list)
2009/3/20 Brian A. <removed_email_address@domain.invalid>

> >
> > and does not remember the environment it was created in.
> > Methods are not closures, unlike blocks/procs/lambdas.
>

Depends what you mean by nesting, which was supposed to be my point --
that
the methods are lexically nested but not dynamically nested. In other
words
their lexical nesting does not imply lexical scope or closures in this
case.
Leo (Guest)
on 2009-03-20 16:23
(Received via mailing list)
> Depends what you mean by nesting, which was supposed to be my point -- that
> the methods are lexically nested but not dynamically nested.

I don't think I understand what you mean with "lexically nested" here.
The point is that the inner method replaces the outer one. Nothing
else. Maybe we could call that stacked methods or whatever. But since
the inner method cannot refer to local variables of the outer method
the word nested IMHO simply makes no sense.

The reason why I posted my possibly confusing statement was because
when I started using ruby, I was myself confused by the lack of nested
methods in ruby. It became easier for me to code in ruby after I
simply accepted that ruby doesn't have nested methods/functions like
many functional languages.
James C. (Guest)
on 2009-03-20 17:13
(Received via mailing list)
2009/3/20 Leo <removed_email_address@domain.invalid>

> > Depends what you mean by nesting, which was supposed to be my point --
> that
> > the methods are lexically nested but not dynamically nested.
>
> I don't think I understand what you mean with "lexically nested" here.
> The point is that the inner method replaces the outer one. Nothing
> else. Maybe we could call that stacked methods or whatever. But since
> the inner method cannot refer to local variables of the outer method
> the word nested IMHO simply makes no sense.



I meant 'lexically' as in the methods are syntactically nested. You're
right, since methods are not closures it makes no sense to talk of them
as
being nested/stacked/whatever when talking about how the code is
executed,
they are nested in appearance only.
This topic is locked and can not be replied to.