Ruby/Moduły: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
Szymon wro (dyskusja | edycje) mNie podano opisu zmian |
Szymon wro (dyskusja | edycje) Nie podano opisu zmian |
||
Linia 1:
== Moduły ==
Moduły w Rubim są podobne do klas, ale:
* Moduł nie może mieć instancji.
* Moduł nie może mieć podklas.
* Moduł jest definiowany przez słowa kluczowe <tt>module</tt> i <tt>end</tt>.
Istnieją dwa typowe zastosowania modułów. Jedno to zebranie powiązanych metod i stałych w jednym centralnym miejscu. Moduł <tt>Math</tt> z standardowej biblioteki Rubiego odgrywa taką rolę:
<pre>
ruby> Math.sqrt(2)
1.41421
ruby> Math::PI
3.14159
</pre>
Operator <tt>::</tt> mówi interpreterowi Rubiego, który moduł powinien on sprawdzić by pobrać wartość zmiennej (możliwe, że jakiś moduł oprócz <tt>Math</tt> może oznaczać coś innego prze <tt>PI</tt>). Jeżeli chcemy odnieść się do metod lub stałych modułu bezpośrednio, bez używania <tt>::</tt>, możemy "zawrzeć" ten moduł używając słowa kluczowego <tt>include</tt>:
<pre>
ruby> include Math
Object
Linia 22 ⟶ 26:
ruby> PI
3.14159
</pre>
Inne użycie modułu nazywane jest ''mixin'' (zmieszanie?). Niektóre języki obiektowe, włączając C++, pozwalają na wielokrotne dziedziczenie, to znaczy, dziedziczenie po więcej niż jednej nadklasie. Przykładem wielokrotnego dziedziczenia ze codziennej rzeczywistości jest budzik. Możesz zarówno zaliczyć budziki do klasy zegarków jak i do klasy przedmiotów z brzęczykami.
Ruby celowo nie implementuje prawdziwego wielokrotnego dziedziczenia, ale technika ''mixin'' jest dobrą alternatywą. Pamiętaj, że moduły nie mogą być instancjonowane, ani nie mogą mieć podklas. Ale jeśli włączymy (<tt>include</tt>) moduł w definicję klasy, jego metody będą efektywnie dodane czy też "wmieszane" w klasę.
''Mixin'' można rozważać jako sposób pytania o wszelkie partykularne własności, które chcemy mieć. Na przykład, jeżeli klasa ma działającą metodę <tt>each</tt>, zmieszanie jej ze standardowym modułem <tt>Enumerable</tt> da nam metody <tt>sort</tt> oraz <tt>find</tt> za darmo.
Takie użycie modułów dostarcza podstawowej funkcjonalności wielokrotnego dziedziczenia, ale pozwala nam reprezentować relacje pomiędzy klasami za pomocą prostych struktur drzewiastych, i w ten sposób upraszcza to znacząco implementację języka (podobny punkt widzenia został przyjęty przez projektantów Javy).
<noinclude>
{{ProstaNawigacja|spis=Ruby|poprzart=Ruby/Metody singletonowe|poprz=Metody singletonowe|nastart=Ruby/Procedury jako obiekty|nast=Procedury jako obiekty}}
|