TL; DR: Moduł jest się nadklasa klasy. Moduł to instancja klasy.
Pozwólcie, że spróbuję wyjaśnić to dokładniej. Proszę wybaczyć moje odręczne rysunki - nie mam żadnych wymyślnych programów do rysowania.
Każda klasa w Rubim ma 1 nadklasę *.

* Z wyjątkiem BasicObject, która nie posiada superklasę.
Przeczytaj powyższą grafikę w następujący sposób: Nadklasa Float jest numeryczna. Nadklasy Numeric to Object, etc ...
Po instancję obiektu, obiekt będzie instancją pewnej klasy. Na przykład "Nathan" jest instancją klasy String. Tak samo jest z "Joe" lub "John". 1 jest instancją klasy Fixnum, podobnie jak 2, 3, 4, itd ...

Czytaj powyższą grafikę tak: "Joe" jest instancją String. 1 jest instancją Fixnum, itd ...
Cóż, w Ruby, w przeciwieństwie do większości innych języków, Class jest po prostu kolejną klasą, i może być również utworzona, podobnie jak Fixnum lub String.

Czytaj powyższą grafikę takiego: 0,01 jest instancją pływaka. String jest instancją klasy, etc ...
Zrozum, że Fixnum jest instancją klasy, podobnie jak „Nathan” jest instancją String. Podobnie jak "John" jest instancją String, Float jest tylko instancją klasy. Każda klasa to tylko przykład klasy, nawet sama klasa!
Zawsze, gdy piszesz nową klasę w swojej aplikacji, po prostu tworzysz nowy obiekt, którego klasą jest Klasa, podobnie jak Hash.new tworzy nowy Hash, lub "Nathan" tworzy nowy ciąg.
# By running this, you will be instantiating a new Class, and
# it will be named Post
class Post < ActiveRecord::Base
end
# Here is another perfectly valid way to write the above code:
Post = Class.new(ActiveRecord::Base)
# you can even instantiate a Class without giving it an explicit name:
x = Class.new(ActiveRecord::Base)
# and since your new things are classes, they can be instantiated
obj1 = Post.new
obj2 = x.new
Co więcej, moduł jest kolejnym przykładem klasy. Za każdym razem, gdy piszesz nowy moduł w swojej aplikacji, właśnie tworzysz nowy moduł.
# this will instantiate a new Module, and assign it to Foo
module Foo
end
# Here is another perfectly valid way to write the above code:
Foo = Module.new
# you can even instantiate a Module without giving it an explicit name.
m = Module.new
Na bok: Moduł to tylko zbiór metod i stałych. Klasy są również zbiorem metod i stałych, ale z dodatkową funkcjonalnością możliwości tworzenia instancji. Nie można utworzyć instancji modułu. Oznacza to, że m.new
nie będzie działać.
Tak, nawiązując do górnej grafiki, Twoje pytanie można odpowiedzieć wprost:
Więc dominująca klasa jest moduł, ale moduł jest klasa?
Widać z górnej grafiki: Moduł jest nadklasy klasy.
Od dołu grafika: Moduł to instancja klasy.
Możliwe duplikat [klasy/Przedmiot paradoksem splątanie] (http://stackoverflow.com/questions/7675774/the-class-object-paradox-confusion). Zobacz także [Ruby metaclass confusion] (http://stackoverflow.com/questions/10525053/ruby-metaclass-confusion). –
To są świetne referencje. Dzięki, że wskazałeś im Andrew. – Nathan
Dziękuję za wskazanie! –