Class <=> module

Hello all,

Recently I got the error described at
https://www.ruby-forum.com/topic/1506818,
which shows that classes can't be used to scope another classes or
modules.

Then I started thinking: why two concepts, class and module, instead of
only one?

Classes heritage, a feature modules don't have, can be done with include
and extend togheter. So we would need another method that does both
include and extend (call it inherit). Classes can't be used to define a
scope.
Modules can't be instanciated, but classes can.

So why not have only one concept that does both class and modules? You
may call this unified concept either class or a module, I'll call it X.

X is capable of extending, including and inheriting, does scoping and be
instanciated.

How does it sound?

regards,
bráulio

···

--
Posted via http://www.ruby-forum.com/.

that's simply not true.

···

On Jul 23, 2013, at 16:04 , Bráulio Bhavamitra <lists@ruby-forum.com> wrote:

Recently I got the error described at
Warning: toplevel constant XYZ referenced Admin:XYZ - RSpec - Ruby-Forum,
which shows that classes can't be used to scope another classes or
modules.

That sounds like: We have two different things that behave differently
and serve different purposes. Why don't we replace them by one thing.

Not very convincing to me... :slight_smile:

And you forgot to mention: classes can inherit only from a single other
class (a conscious decision by Matz), but you can include many modules.
Seems difficult to unify that in one concept.

Regards,
Marcus

···

Am 24.07.2013 01:04, schrieb Bráulio Bhavamitra:

Hello all,

Recently I got the error described at
Warning: toplevel constant XYZ referenced Admin:XYZ - RSpec - Ruby-Forum,
which shows that classes can't be used to scope another classes or
modules.

Then I started thinking: why two concepts, class and module, instead of
only one?

Classes heritage, a feature modules don't have, can be done with include
and extend togheter. So we would need another method that does both
include and extend (call it inherit). Classes can't be used to define a
scope.
Modules can't be instanciated, but classes can.

So why not have only one concept that does both class and modules? You
may call this unified concept either class or a module, I'll call it X.

X is capable of extending, including and inheriting, does scoping and be
instanciated.

How does it sound?

--
<https://github.com/stomar/&gt;

X is capable of extending, including and inheriting, does scoping and be
instanciated.

I'll give some extra explanation with an example.

With today model of inheritance, sometime you get stuck with the parent
class and is forced to move methods to a module and include/extend them.

So instead of inheritance in class definition (with the <), I propose a
method inherit, which does both include and extend.

x A
  inherit D
  extend C

  # ... class and instance methods..
end
x B
  include C

  # ... class and instance methods..
end
x C

  # ... class and instance methods..
end
x D

  # ... class and instance methods..
end

···

--
Posted via http://www.ruby-forum.com/\.

That seems inaccurate to me:

C1 = Class.new Object
C2 = Class.new C1
C3 = Class.new C2

M1 = Module.new
M2 = Module.new
C4 = Class.new { include M2, M1 }

···

On Wed, Jul 24, 2013 at 1:10 AM, <sto.mar@web.de> wrote:

And you forgot to mention: classes can inherit only from a single other
class (a conscious decision by Matz), but you can include many modules.
Seems difficult to unify that in one concept.

> Recently I got the error described at
> Warning: toplevel constant XYZ referenced Admin:XYZ - RSpec - Ruby-Forum,
> which shows that classes can't be used to scope another classes or
> modules.

that's simply not true.

So why in rails activerecord is defined as ActiveRecord::Base instead of
just ActiveRecord?

best regards,
bráulio

--
"Lute pela sua ideologia. Seja um com sua ideologia. Viva pela sua
ideologia. Morra por sua ideologia" P.R. Sarkar

EITA - Educação, Informação e Tecnologias para Autogestão
Blog - Bráulio Bhavamitra
http://eita.org.br

···

On Wed, Jul 24, 2013 at 9:48 AM, Bráulio Bhavamitra <braulio@eita.org.br>wrote:

On Tue, Jul 23, 2013 at 9:55 PM, Ryan Davis <ryand-ruby@zenspider.com>wrote:

On Jul 23, 2013, at 16:04 , Bráulio Bhavamitra <lists@ruby-forum.com> >> wrote:

--
"Lute pela sua ideologia. Seja um com sua ideologia. Viva pela sua
ideologia. Morra por sua ideologia" P.R. Sarkar

EITA - Educação, Informação e Tecnologias para Autogestão

Ryan Davis wrote in post #1116443:

···

On Jul 23, 2013, at 16:04 , Brulio Bhavamitra <lists@ruby-forum.com> > wrote:

Recently I got the error described at
Warning: toplevel constant XYZ referenced Admin:XYZ - RSpec - Ruby-Forum,
which shows that classes can't be used to scope another classes or
modules.

that's simply not true.

So why in rails activerecord is defined as ActiveRecord::Base instead of
just ActiveRecord?

--
Posted via http://www.ruby-forum.com/\.

That sounds like: We have two different things that behave differently
and serve different purposes. Why don't we replace them by one thing.

Not very convincing to me... :slight_smile:

The thing is that sometimes both features, from classes and modules, are
needed in just one thing.

···

--
Posted via http://www.ruby-forum.com/\.

    And you forgot to mention: classes can inherit only from a single other
    class (a conscious decision by Matz), but you can include many modules.
    Seems difficult to unify that in one concept.

That seems inaccurate to me:

C1 = Class.new Object
C2 = Class.new C1
C3 = Class.new C2

I was alluding to multiple inheritance, meaning a class
inherits _directly_ from more than one superclass.

M1 = Module.new
M2 = Module.new
C4 = Class.new { include M2, M1 }

Regards,
Marcus

···

Am 24.07.2013 14:35, schrieb Josh Cheek:

On Wed, Jul 24, 2013 at 1:10 AM, <sto.mar@web.de > <mailto:sto.mar@web.de>> wrote:

--
<https://github.com/stomar/&gt;

    And you forgot to mention: classes can inherit only from a single
other
    class (a conscious decision by Matz), but you can include many
modules.
    Seems difficult to unify that in one concept.

That seems inaccurate to me:

C1 = Class.new Object
C2 = Class.new C1
C3 = Class.new C2

I was alluding to multiple inheritance, meaning a class
inherits _directly_ from more than one superclass.

The point is that inheritance may be done with include + extend from a
module.

M1 = Module.new

M2 = Module.new
C4 = Class.new { include M2, M1 }

Regards,
Marcus

--
<https://github.com/stomar/&gt;

--
"Lute pela sua ideologia. Seja um com sua ideologia. Viva pela sua
ideologia. Morra por sua ideologia" P.R. Sarkar

EITA - Educação, Informação e Tecnologias para Autogestão
Blog - Bráulio Bhavamitra
http://eita.org.br

···

On Wed, Jul 24, 2013 at 9:54 AM, Bráulio Bhavamitra <braulio@eita.org.br>wrote:

On Wed, Jul 24, 2013 at 9:51 AM, <sto.mar@web.de> wrote:

Am 24.07.2013 14:35, schrieb Josh Cheek:

On Wed, Jul 24, 2013 at 1:10 AM, <sto.mar@web.de >>> <mailto:sto.mar@web.de>> wrote:

--
"Lute pela sua ideologia. Seja um com sua ideologia. Viva pela sua
ideologia. Morra por sua ideologia" P.R. Sarkar

EITA - Educação, Informação e Tecnologias para Autogestão

unknown wrote in post #1116513:

C1 = Class.new Object
C2 = Class.new C1
C3 = Class.new C2

I was alluding to multiple inheritance, meaning a class
inherits _directly_ from more than one superclass.

The point is that inheritance may be done with include + extend from a
module.
In fact, many libraries already prefer include/extend from module than
heritage. See MongoMapper for example.

···

Am 24.07.2013 14:35, schrieb Josh Cheek:

M1 = Module.new
M2 = Module.new
C4 = Class.new { include M2, M1 }

Regards,
Marcus

--
Posted via http://www.ruby-forum.com/\.

I still don't understand. I showed that you can inherit from multiple
classes like you can inherit from multiple modules. Yes there are other
differences, but this does not seem to be one of them. Perhaps you think
that modules have some sort of fancier inheritance? If so, this is not the
case. When you include a module, an anonymous class with the module's
methods gets inserted as the superclass.

···

On Wed, Jul 24, 2013 at 7:51 AM, <sto.mar@web.de> wrote:

Am 24.07.2013 14:35, schrieb Josh Cheek:

On Wed, Jul 24, 2013 at 1:10 AM, <sto.mar@web.de >> <mailto:sto.mar@web.de>> wrote:

    And you forgot to mention: classes can inherit only from a single
other
    class (a conscious decision by Matz), but you can include many
modules.
    Seems difficult to unify that in one concept.

That seems inaccurate to me:

C1 = Class.new Object
C2 = Class.new C1
C3 = Class.new C2

I was alluding to multiple inheritance, meaning a class
inherits _directly_ from more than one superclass.

unknown wrote in post #1116513:

C1 = Class.new Object
C2 = Class.new C1
C3 = Class.new C2

I was alluding to multiple inheritance, meaning a class
inherits _directly_ from more than one superclass.

The point is that inheritance may be done with include + extend from a
module.

But that is not the same as subclassing.

In fact, many libraries already prefer include/extend from module than
heritage. See MongoMapper for example.

Both approaches have their own use cases.

Regards,
Marcus

···

Am 24.07.2013 14:59, schrieb Bráulio Bhavamitra:

Am 24.07.2013 14:35, schrieb Josh Cheek:

--
<https://github.com/stomar/&gt;

You cannot extend from arbitrary classes. If I want to create a class
that extends String and Hash, for example, I can't.
On the other hand I can extend any number of arbitrary modules.

Jesus.

···

On Wed, Jul 24, 2013 at 3:34 PM, Josh Cheek <josh.cheek@gmail.com> wrote:

On Wed, Jul 24, 2013 at 7:51 AM, <sto.mar@web.de> wrote:

Am 24.07.2013 14:35, schrieb Josh Cheek:

On Wed, Jul 24, 2013 at 1:10 AM, <sto.mar@web.de >>> <mailto:sto.mar@web.de>> wrote:

    And you forgot to mention: classes can inherit only from a single
other
    class (a conscious decision by Matz), but you can include many
modules.
    Seems difficult to unify that in one concept.

That seems inaccurate to me:

C1 = Class.new Object
C2 = Class.new C1
C3 = Class.new C2

I was alluding to multiple inheritance, meaning a class
inherits _directly_ from more than one superclass.

I still don't understand. I showed that you can inherit from multiple
classes like you can inherit from multiple modules. Yes there are other
differences, but this does not seem to be one of them. Perhaps you think
that modules have some sort of fancier inheritance? If so, this is not the
case. When you include a module, an anonymous class with the module's
methods gets inserted as the superclass.

            And you forgot to mention: classes can inherit only from a
        single other
            class (a conscious decision by Matz), but you can include
        many modules.
            Seems difficult to unify that in one concept.

        That seems inaccurate to me:

        C1 = Class.new Object
        C2 = Class.new C1
        C3 = Class.new C2

    I was alluding to multiple inheritance, meaning a class
    inherits _directly_ from more than one superclass.

I still don't understand. I showed that you can inherit from multiple
classes like you can inherit from multiple modules. Yes there are other

No, they behave differently!
The modules are *not* superclasses of the classes they are mixed into:

  C1 = Class.new Object
  C2 = Class.new C1
  C3 = Class.new C2

  C3.superclass # => C2
  C3.superclass.superclass # => C1

  M1 = Module.new
  M2 = Module.new
  C4 = Class.new { include M2, M1 }

  C4.superclass # => Object

···

Am 24.07.2013 15:34, schrieb Josh Cheek:

On Wed, Jul 24, 2013 at 7:51 AM, <sto.mar@web.de > <mailto:sto.mar@web.de>> wrote:
    Am 24.07.2013 14 <tel:24.07.2013%2014>:35, schrieb Josh Cheek:
        On Wed, Jul 24, 2013 at 1:10 AM, <sto.mar@web.de > <mailto:sto.mar@web.de> > <mailto:sto.mar@web.de <mailto:sto.mar@web.de>>> wrote:

differences, but this does not seem to be one of them. Perhaps you think
that modules have some sort of fancier inheritance? If so, this is not
the case. When you include a module, an anonymous class with the
module's methods gets inserted as the superclass.

--
<https://github.com/stomar/&gt;

I'm not sure that's what he was trying to say.

···

On Wed, Jul 24, 2013 at 10:25 AM, Jesús Gabriel y Galán < jgabrielygalan@gmail.com> wrote:

On Wed, Jul 24, 2013 at 3:34 PM, Josh Cheek <josh.cheek@gmail.com> wrote:
> On Wed, Jul 24, 2013 at 7:51 AM, <sto.mar@web.de> wrote:
>>
>> Am 24.07.2013 14:35, schrieb Josh Cheek:
>>>
>>> On Wed, Jul 24, 2013 at 1:10 AM, <sto.mar@web.de > >>> <mailto:sto.mar@web.de>> wrote:
>>>
>>>
>>> And you forgot to mention: classes can inherit only from a single
>>> other
>>> class (a conscious decision by Matz), but you can include many
>>> modules.
>>> Seems difficult to unify that in one concept.
>>>
>>>
>>> That seems inaccurate to me:
>>>
>>> C1 = Class.new Object
>>> C2 = Class.new C1
>>> C3 = Class.new C2
>>
>>
>> I was alluding to multiple inheritance, meaning a class
>> inherits _directly_ from more than one superclass.
>>
>
> I still don't understand. I showed that you can inherit from multiple
> classes like you can inherit from multiple modules. Yes there are other
> differences, but this does not seem to be one of them. Perhaps you think
> that modules have some sort of fancier inheritance? If so, this is not
the
> case. When you include a module, an anonymous class with the module's
> methods gets inserted as the superclass.

You cannot extend from arbitrary classes. If I want to create a class
that extends String and Hash, for example, I can't.
On the other hand I can extend any number of arbitrary modules.

Jesus.

They are, the code examples just say otherwise because Ruby lies to you.
It's the same as how the singleton class is actually the object's class,
even though when you ask it about its class, it will tell you what it was
instantiated from.

This used to be a good blog about it
http://web.archive.org/web/20110214135710/http://carboni.ca/blog/p/Modules-How-Do-They-Workbut
sadly it's down now, so you can't see the images.

-Josh

···

On Wed, Jul 24, 2013 at 12:54 PM, <sto.mar@web.de> wrote:

Am 24.07.2013 15:34, schrieb Josh Cheek:
> On Wed, Jul 24, 2013 at 7:51 AM, <sto.mar@web.de > > <mailto:sto.mar@web.de>> wrote:
>
> Am 24.07.2013 14 <tel:24.07.2013%2014>:35, schrieb Josh Cheek:
>
> On Wed, Jul 24, 2013 at 1:10 AM, <sto.mar@web.de > > <mailto:sto.mar@web.de> > > <mailto:sto.mar@web.de <mailto:sto.mar@web.de>>> wrote:
>
>
> And you forgot to mention: classes can inherit only from a
> single other
> class (a conscious decision by Matz), but you can include
> many modules.
> Seems difficult to unify that in one concept.
>
>
> That seems inaccurate to me:
>
> C1 = Class.new Object
> C2 = Class.new C1
> C3 = Class.new C2
>
>
> I was alluding to multiple inheritance, meaning a class
> inherits _directly_ from more than one superclass.
>
>
> I still don't understand. I showed that you can inherit from multiple
> classes like you can inherit from multiple modules. Yes there are other

No, they behave differently!
The modules are *not* superclasses of the classes they are mixed into: