Moose: Porovnání verzí
02. atributy |
02. Attributy |
||
Řádek 29: | Řádek 29: | ||
můžeme (pro legraci) používat i české názvy proměnných i s diakritikou (pro vážné programování bych to ale asi nedoporučoval). |
můžeme (pro legraci) používat i české názvy proměnných i s diakritikou (pro vážné programování bych to ale asi nedoporučoval). |
||
Z nějakých důvodů to ale s |
Z nějakých důvodů to ale s diakritikou nefunguje v případě, že tak nazveme třídu; příkaz |
||
<source lang='perl'> |
<source lang='perl'> |
||
Řádek 37: | Řádek 37: | ||
Kočka is not a module name at /usr/lib/perl5/Class/MOP/Package.pm line 207. |
Kočka is not a module name at /usr/lib/perl5/Class/MOP/Package.pm line 207. |
||
BEGIN failed--compilation aborted at ./07.01Kocka.pl line 9. |
BEGIN failed--compilation aborted at ./07.01Kocka.pl line 9. |
||
Nejspíš se jedná o bug – viz [http://perldoc.perl.org/utf8.html Pragmas > utf8] až na konci: Bugs. |
|||
=== 01 Stvoření koček === |
=== 01 Stvoření koček === |
||
Řádek 53: | Řádek 55: | ||
#! /usr/bin/perl |
#! /usr/bin/perl |
||
Modern::Perl; |
use Modern::Perl; |
||
use utf8; |
use utf8; |
||
binmode STDOUT, ':utf8'; |
binmode STDOUT, ':utf8'; |
||
Řádek 104: | Řádek 106: | ||
#! /usr/bin/perl |
#! /usr/bin/perl |
||
Modern::Perl; |
use Modern::Perl; |
||
use utf8; |
use utf8; |
||
binmode STDOUT, ':utf8'; |
binmode STDOUT, ':utf8'; |
||
Řádek 113: | Řádek 115: | ||
has 'jméno', is=>'ro', isa=>'Str'; |
has 'jméno', is=>'ro', isa=>'Str'; |
||
has 'věk', is=>'rw', isa=>''; |
has 'věk', is=>'rw', isa=>'Int'; |
||
has 'dieta', is=>'rw'; |
has 'dieta', is=>'rw'; |
||
} |
} |
||
Řádek 119: | Řádek 121: | ||
my $tlusťoch = Kocka->new(jméno=>'Tlusťoch', věk=8, dieta=>'produkty moře'); |
my $tlusťoch = Kocka->new(jméno=>'Tlusťoch', věk=8, dieta=>'produkty moře'); |
||
say tlusťoch->jméno(), ', ', tlusťoch->věk(), 'let, dieta: ', tlusťoch->dieta(); |
say $tlusťoch->jméno(), ', ', $tlusťoch->věk(), ' let, dieta: ', $tlusťoch->dieta(); |
||
tlusťoch->dieta( 'neslaná'); |
$tlusťoch->dieta( 'neslaná'); |
||
say tlusťoch->jméno(), ', ', tlusťoch->věk(), 'let, nová dieta: ', tlusťoch->dieta(); |
say $tlusťoch->jméno(), ', ', $tlusťoch->věk(), ' let, nová dieta: ', $tlusťoch->dieta(); |
||
</source> |
</source> |
||
Výstup programu: |
|||
<pre> |
|||
Tlusťoch, 8 let, dieta: produkty moře |
|||
Tlusťoch, 8 let, nová dieta: neslaná |
|||
</pre> |
|||
<source lang='perl'> |
<source lang='perl'> |
Verze z 24. 10. 2012, 19:50
Moose je objektový systém, vytvořený jako knihovna v Perlu. V podstatě vytváří určitý způsob myšlení (školu), jak zacházet s objekty v Perlu (s objekty se zde jinak dá zacházet celkem volně).
Instalace
Ubuntu
Při výběru balíku libmoose-perl budou nainstalovány i následující balíky:
- libb-hooks-endofscope-perl (verze 0.08-1) bude nainstalován
- libclass-load-xs-perl (verze 0.03-1) bude nainstalován
- libdevel-globaldestruction-perl (verze 0.04-2) bude nainstalován
- libdevel-partialdump-perl (verze 0.15-1) bude nainstalován
- libeval-closure-perl (verze 0.06-1) bude nainstalován
- libmoose-perl (verze 2.0401-1) bude nainstalován
- libnamespace-clean-perl (verze 0.22-1) bude nainstalován
- libsub-exporter-perl (verze 0.982-1) bude nainstalován
- libsub-identify-perl (verze 0.04-1build2) bude nainstalován
- libtask-weaken-perl (verze 1.03-1) bude nainstalován
- libvariable-magic-perl (verze 0.47-1build1) bude nainstalován
Tutoriál
Sytému Moose je věnována kapitola Objects v knize Modern Perl#07. Objekty. Touto kapitolou je inspirován tento tutoriál. Poznamenejme, že direktivami
use utf8;
binmode STDOUT, ':utf8';
můžeme (pro legraci) používat i české názvy proměnných i s diakritikou (pro vážné programování bych to ale asi nedoporučoval).
Z nějakých důvodů to ale s diakritikou nefunguje v případě, že tak nazveme třídu; příkaz
package Kočka
vyvolá chybu:
Kočka is not a module name at /usr/lib/perl5/Class/MOP/Package.pm line 207. BEGIN failed--compilation aborted at ./07.01Kocka.pl line 9.
Nejspíš se jedná o bug – viz Pragmas > utf8 až na konci: Bugs.
01 Stvoření koček
Tak tedy, vytvoříme si třídu koček, které umí mňoukat, a dvě její instance, Lízu a Mňauka, které pak z mňoukání vyzkoušíme. Ale ještě k terminologii, která je v objektovém programování celkem obvyklá:
- Třída je v Perlu v podstatě to samé, co balík. Má to logiku, zpravidla definice tříd jsou i v jiném (např. knihovním) souboru *.pm, ale klidně mohou být i v tom samém souboru. Hlavně to ale znamená, že všechny proměnné tam jsou plně kvalifikované, tj. mají vlastní jmenný prostor, daný názvem třídy.
- Konkrétní instance se vytvářejí pomocí konstruktoru new
- metoda je funkce, asociovaná s třídou. Když se volá, má vždy nějaký invokant, se kterým metoda pracuje:
- když vytváříme nový objekt, je tím invokantem jméno třídy
- když voláme metodu u konkrétní instance, je tím invokantem tato instance.
- Invokant se v Perlu předává funkci jakožto první argument.
I když se nejedná o nějaký předpis jazyka Perl, jde o určitou konvenci, že jména tříd začínají velkými písmeny (třída je jakoby větší, protože může mít mnoho instatncí), zatímco jména instancí začínají malými písmeny, tedy je: Kocka líza. (Je to přesně naopak než v češtině, angličtině i jiných jazycích, kde píšeme kočka Líza.) Pokud se nám to nelíbí, nemusíme samozřejmě tuto konvenci dodržovat.
#! /usr/bin/perl
use Modern::Perl;
use utf8;
binmode STDOUT, ':utf8';
package Kocka
{
use Moose;
sub mňau
{
my $self = shift;
say 'Mňau!';
}
}
my $líza = Kocka->new();
my $mňouk = Kocka->new();
$líza->mňau();
$mňouk->mňau();
- 1. Říkáme shellu, který program má interpretovat tento skript.
- 2. Programujeme ve stylu Modern::Perl.
- 4. Co je ve skriptu, bude bráno jako znaky UTF-8
- 5. Co půjde na standardní výstup, bude chápáno také jako text v UTF-8
- 7. Vytvářím třídu Kocka.
- 9. Používám k tomu knihovnu Moose. (Tím je dané např. i implicitní vytvoření konstruktoru new.)
- 11. Podprogram, přesněji řečeno metoda mňau, kde říkám, jak má libovolná kočka mňoukat.
- 13. Uložíme invokant (tedy první parametr funkce) do proměnné $self.
- 14. Tady konečně říkám, jak má kočka mňoukat.
- 18.–19. Postupně vytvářím dvě instance koček, tedy dva konkrétní případy, kočky Lízu a Mňouka.
- 21.-22. Vyzkouším si, jak mňoukají.
Výstup skriptu bude jednoduchý:
Mňau! Mňau!
Někdo namítne, že je to nedokonalé, že Mňouk je kocour a ten že mňouká jinak. Námitka je na místě, časem zjistíme, že je možno vytvářet i různá pohlaví, která budou mňoukat jinak.
02. Atributy
Když už vytváříme takovéto kočky, bylo by dobré, aby samy kočky věděly, jak se jmenují a mohly se nám na požádání třeba představit. Tedy všechny kočky (tj. třída koček) by měla mít nějaký šuplíček, kam by se ukládalo jméno té které kočky. A pak třeba její věk (kolik je jí let) a jestli třeba nemá nějakou dietu (třeba vytváříme databázi pacientů v kočičí nemocnici).
Tyto tzv. atributy se v Mose přikládají funkcí has(); zde je možné rovněž určit, jestli je možné tento atribut dále měnit a jaký typ proměnné bude použit, což představuje určitý typ kontroly nad tím, jak budeme moci s objektem nakládat.
#! /usr/bin/perl
use Modern::Perl;
use utf8;
binmode STDOUT, ':utf8';
package Kocka
{
use Moose;
has 'jméno', is=>'ro', isa=>'Str';
has 'věk', is=>'rw', isa=>'Int';
has 'dieta', is=>'rw';
}
my $tlusťoch = Kocka->new(jméno=>'Tlusťoch', věk=8, dieta=>'produkty moře');
say $tlusťoch->jméno(), ', ', $tlusťoch->věk(), ' let, dieta: ', $tlusťoch->dieta();
$tlusťoch->dieta( 'neslaná');
say $tlusťoch->jméno(), ', ', $tlusťoch->věk(), ' let, nová dieta: ', $tlusťoch->dieta();
Výstup programu:
Tlusťoch, 8 let, dieta: produkty moře Tlusťoch, 8 let, nová dieta: neslaná