Newbie q on class Foo::Bar

What's the point of a class-within-a-class? For example, I take it that
I can say:

class Foo
  class Bar
    def whatever
    ...

And then I can say

my_foo_bar = Foo::Bar.new

For example, isn't that what something like File::Stat is?

My question is, am I right about this, and if so, what's the point of
doing so? I take it that Bar is not magically related to Foo - it can't
see Foo's methods or anything like that, can it? So is this merely a way
of using a class (Foo) as a namespace so that related classes (like Bar)
are all in one place? Thx - m.

···

--
matt neuburg, phd = matt@tidbits.com, http://www.tidbits.com/matt/
Tiger - http://www.takecontrolbooks.com/tiger-customizing.html
AppleScript - http://www.amazon.com/gp/product/0596102119
Read TidBITS! It's free and smart. http://www.tidbits.com

matt neuburg wrote:

What's the point of a class-within-a-class? For example, I take it that
I can say:

class Foo
  class Bar
    def whatever
    ...

And then I can say

my_foo_bar = Foo::Bar.new

For example, isn't that what something like File::Stat is?

My question is, am I right about this, and if so, what's the point of
doing so? I take it that Bar is not magically related to Foo - it can't
see Foo's methods or anything like that, can it? So is this merely a way
of using a class (Foo) as a namespace so that related classes (like Bar)
are all in one place? Thx - m.

One reason is to create a class that is private. You may be aware that one
wants to separate results from implementation (separate the result from the
method used to produce the result), this can extend to classes that need to
exist, but don't need to be made available as part of the interface. That
way, the programmer can change the class without having to ask what
external effects this might have.

There are other reasons, this is just one.

···

--
Paul Lutus
http://www.arachnoid.com

Hi --

···

On Fri, 27 Oct 2006, Paul Lutus wrote:

matt neuburg wrote:

What's the point of a class-within-a-class? For example, I take it that
I can say:

class Foo
  class Bar
    def whatever
    ...

And then I can say

my_foo_bar = Foo::Bar.new

For example, isn't that what something like File::Stat is?

My question is, am I right about this, and if so, what's the point of
doing so? I take it that Bar is not magically related to Foo - it can't
see Foo's methods or anything like that, can it? So is this merely a way
of using a class (Foo) as a namespace so that related classes (like Bar)
are all in one place? Thx - m.

One reason is to create a class that is private. You may be aware that one
wants to separate results from implementation (separate the result from the
method used to produce the result), this can extend to classes that need to
exist, but don't need to be made available as part of the interface. That
way, the programmer can change the class without having to ask what
external effects this might have.

The nesting won't give you privacy, though; the class can still be
accessed from outside. You could of course not document it, but
that's no more true of a nested class than a non-nested one.

David

--
                   David A. Black | dblack@wobblini.net
Author of "Ruby for Rails" [1] | Ruby/Rails training & consultancy [3]
DABlog (DAB's Weblog) [2] | Co-director, Ruby Central, Inc. [4]
[1] Ruby for Rails | [3] http://www.rubypowerandlight.com
[2] http://dablog.rubypal.com | [4] http://www.rubycentral.org

I'm glad you're weighing in here, since, though this is a common enough
Ruby idiom, Rails is the case in point that got me thinking about this.
So, for example, have ActionController::Base and
ActionController::AbstractRequest something in common (other than being
packaged in the same namespace)? Thx - m.

···

<dblack@wobblini.net> wrote:

Hi --

On Fri, 27 Oct 2006, Paul Lutus wrote:

> matt neuburg wrote:
>
>> What's the point of a class-within-a-class? For example, I take it that
>> I can say:
>>
>> class Foo
>> class Bar
>> def whatever
>> ...
>>
>> And then I can say
>>
>> my_foo_bar = Foo::Bar.new
>>
>> For example, isn't that what something like File::Stat is?
>>
>> My question is, am I right about this, and if so, what's the point of
>> doing so? I take it that Bar is not magically related to Foo - it can't
>> see Foo's methods or anything like that, can it? So is this merely a way
>> of using a class (Foo) as a namespace so that related classes (like Bar)
>> are all in one place? Thx - m.
> One reason is to create a class that is private. You may be aware that one
> wants to separate results from implementation (separate the result from the
> method used to produce the result), this can extend to classes that need to
> exist, but don't need to be made available as part of the interface. That
> way, the programmer can change the class without having to ask what
> external effects this might have.

The nesting won't give you privacy, though; the class can still be
accessed from outside. You could of course not document it, but
that's no more true of a nested class than a non-nested one.

--
matt neuburg, phd = matt@tidbits.com, Matt Neuburg’s Home Page
Tiger - http://www.takecontrolbooks.com/tiger-customizing.html
AppleScript - http://www.amazon.com/gp/product/0596102119
Read TidBITS! It's free and smart. http://www.tidbits.com