<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule">

<channel>
<title><![CDATA[Perl 6: Perl 6 Tutorial Part 6]]></title>
<link>http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_6</link>
<description></description>
<pubDate>Fri, 06 Aug 2010 23:56:07 -0000</pubDate>
<webMaster>synedra@gmail.com</webMaster>
<generator>Socialtext Workspace v2.14.7.2</generator>

<item>
<title><![CDATA[Perl 6 Tutorial Part 6]]></title>
<link>http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_6</link>
<description><![CDATA[<div class="wiki">
<div class="nlw_phrase"><table class='toc'><tr><td><div class="wiki">
<h3 id="contents">Contents: []</h3>
<ul>
<li><span class="nlw_phrase"><a title="section link" href="#objects_and_roles">Objects and Roles</a><!-- wiki: {link: [] Objects and Roles} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#das_alte_system">Das alte System</a><!-- wiki: {link: [] Das alte System} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#und_nun_das_neue">... und nun das Neue</a><!-- wiki: {link: [] ... und nun das Neue} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#verwendung_von_objekten">Verwendung von Objekten</a><!-- wiki: {link: [] Verwendung von Objekten} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#delegier_die_arbeit">Delegier die Arbeit</a><!-- wiki: {link: [] Delegier die Arbeit} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#regelung_der_erbschaft">Regelung der Erbschaft</a><!-- wiki: {link: [] Regelung der Erbschaft} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#rollen_die_ich_spiele">Rollen die ich spiele</a><!-- wiki: {link: [] Rollen die ich spiele} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#zeig_mir_dein_inneres">Zeig mir dein Inneres</a><!-- wiki: {link: [] Zeig mir dein Inneres} --></span></li>
</ul>
</div>
</td></tr></table><!-- wiki: {toc: } --></div><br /><br /><h3 id="objects_and_roles">Objects and Roles</h3>
<p>
Willkommen und hereinspaziert mein Damen und Herren. Hier erleben sie Menschen -<br />
Tiere - Sensationen, so etwas hat die Welt noch nicht gesehen. Und fürwahr das <br />
Objektsystem von Perl 6 übertrifft in seiner Ausgereiftheit und Vielseitigkeit <br />
alles bisher aus der Praxis Bekannte. Hier gab es einige der stärksten Änderungen<br />
gegenüber Perl 5. Vieles davon ist jedoch heute bereits (leicht abgeändert) mit <br />
Moose umsetzbar.</p>
<h3 id="das_alte_system">Das alte System</h3>
<p>
Die alte OOP bestach vor allem durch ihre Freiheit und daß sie mit minimalstem<br />
syntaktischen Aufwand in das objektlose Perl 4 eingefügt wurde. Nur C&lt;bless&gt; (der<br />
Befehl zur Erzeugung eines Perl 5-Objektes) kam extra deshalb dazu. Und dieser<br />
Befehl bindet &quot;lediglich&quot; eine Referenz - meist eine Hashreferenz - an ein C&lt;package&gt;<br />
und macht sie so zum Objekt. Damian Conway bewundert diesen &quot;Taschenspielertrick&quot;, <br />
und zeigt in seinem Buch I&lt;&quot;Object Oriented Perl&quot;&gt;&quot; die immensen Möglichkeiten des<br />
&quot;Tricks&quot; auf. Larry hatte diesen &quot;Trick&quot; eigentlich von Python abgeschaut, es <br />
aber seitdem bereut. Nicht nur Guido van Rossum hat mit der kürzlich erschienenen<br />
Version 3 diese Art der OOP aus Python gestrichen, auch Perlkreise sehen dieses<br />
Objektsystem derzeit als größte Schwachstelle der Perlsyntax. Es ist nicht nur für<br />
viele Perlneulinge eine echte Hürde, sondern verstößt auch gegen Perls eigene Regeln.</p>
<p>
Was Perl ausmacht, zeigt das alltägliche Grundbeispiel, das gleichzeitig den ersten<br />
Babyschritten jedes Programmierers entspricht: C&lt;print &quot;Ich kann schon laufen!\n&quot;&gt;.<br />
Keine Systembibliothek wird importiert, keine C&lt;main&gt;-Routine ist notwendig, keine<br />
Klasse muss drumherum gestrickt werden. Dem Programmierer wird weder Arbeit noch<br />
Wissen abverlangt, das nicht unbedingt notwendig ist. In Perl 6 und 5.10 reicht<br />
sogar C&lt;say &quot;Ich kann schon laufen!&quot;&gt;, da die Bedeutung von Steuerzeichen sicher<br />
nicht das Erste ist, was Anfänger lernen sollten. Wenn er jedoch eine einfache<br />
Klasse schreiben will, braucht er einige Kenntnis von Namensräumen, Referenzen,<br />
Hashes, C&lt;bless&gt; und Perls eigenwilliger Art der Parameterübergabe, wie es das <br />
folgende Beispiel zeigt:</p>
<p>
Perl 5:</p>
<p>
	package Heart::Gold;</p>
<p>
	sub new {<br />
		bless {speed =&gt; 0 }, shift;<br />
	}</p>
<p>
	sub speed {<br />
	 my $self = shift;<br />
	 my $speed = shift;<br />
	 if ($speed) { $self-&gt;{speed} = $speed }<br />
	 else { $self-&gt;{speed} }<br />
	}</p>
<p>
	sub stop {<br />
	 my $self = shift;<br />
	 $self-&gt;{speed} = 0;<br />
	}</p>
<p>
Benutzt wird diese Klasse wie folgt:</p>
<p>
Perl 5:</p>
<p>
	my $ufo = Heart::Gold-&gt;new();<br />
	# &quot;gib Gas, Scotty&quot;<br />
	$ufo-&gt;speed('7c');<br />
	# &quot;alle Maschinen halt&quot;<br />
	$ufo-&gt;stop();</p>
<p>
Für gute Perl-Programmierer ist das kein Problem, aber sie freuen sich über Wege,<br />
das Gleiche mit weniger Tippaufwand zu erreichen, wie die Existenz von I&lt;Moose&gt;,<br />
I&lt;Class::Accessor::Fast&gt; und mindestens einem Dutzend weiterer Module beweist. <br />
Tipparbeit zu reduzieren ist ebenfalls ein wichtiges Perlziel.</p>
<h3 id="und_nun_das_neue">... und nun das Neue</h3>
<p>
Eine fast funktionsgleiche Klasse sähe in Perl 6 so aus:</p>
<p>
Perl 6:</p>
<p>
	class Heart::Gold {<br />
		has $.speed;<br />
		method stop { $speed = 0 }<br />
	}</p>
<p>
Das ist kurz, klar und weniger fehleranfällig. Bereits der erste Befehl kündigt<br />
unmissverständlich an, daß hier eine Klasse erzeugt wird (deklarativer Syntax).<br />
C&lt;class&gt; ist (genau genommen) ein I&lt;Blockmodifikator&gt;, der dem nachfolgendem <br />
(in geschweiften Klammern stehenden) lexikalischen Bereich einen Namen zuweist<br />
(wie C&lt;package&gt;) und daraus ein Protoobjekt erzeugt aus dem nachfolgend Objekte<br />
geklont werden können. Perl 6 hat eine prototyp-basierte OOP, ähnlich Javascript. <br />
Möglich ist auch die Schreibweise C&lt;class Heart::Gold;&gt; ohne geschweifte Klammern.<br />
Dann nimmt der Interpreter jedoch an, daß alles bis zum Dateiende zu jener Klasse<br />
gehört.</p>
<p>
Der zweite Befehl (C&lt;has&gt;) definiert ein Attribut der Klasse. Attribute sind die<br />
Daten die zu jedem Objekt gehören und die von außen unsichtbar sind. (Das wäre in<br />
Perl 5 nicht einfach möglich.) Auf manche dieser Daten ist aber der Zugriff von<br />
außen gewünscht. In vielen Sprachen werden deshalb Methoden geschrieben die Werte<br />
von und zu den Attributen weiterleiten. In Perl 6 kann der Programmierer mit der<br />
Twigil (dem Punkt nach &quot;$&quot;) die öffentlichen Attribute markieren und die Methode<br />
gleichen Namens, die einen Zugriff von außen erlaubt, wird automatisch erzeugt.<br />
Möchte man neben dem &quot;Getter&quot; auch einen &quot;Setter&quot; (Methode, die dem Attribut <br />
einen Wert zuweist), muss man das Attribut mit dem Trait (Eigenschaft die während<br />
der Kompilierung unabänderlich festgelegt wird - zu deutsch: Charakterzug) C&lt;rw&gt;<br />
versehen.</p>
<p>
		has $.speed is rw;</p>
<p>
C&lt;rw&gt; steht für &quot;read/write&quot; (lesen/schreiben) und wird zu vielen Gelegenheiten<br />
angewendet, z.B. wenn eine Datei für Lese- und Schreibzugriff geöffnet wird. <br />
Der erzeugte Setter ist eine Lvalue-Routine. Ihm kann also zugewiesen werden.<br />
Das erlaubt nicht nur einen einfachen, intuitiven Umgang, da Getter und Setter<br />
sich wie Variablen verhalten, es vermeidet auch hinterhältige Fallen, die eine<br />
selbstgeschriebene, kombinierte Getter/Setter-Methode aufstellt. Sie sind auch<br />
angenehmer im Umgang als die Getter/Setter, die in unserem Beispiel &quot;GetSpeed&quot;<br />
und &quot;SetSpeed&quot; oder &quot;get_speed&quot; / &quot;set_speed&quot; heißen würden. Sind alle oder die<br />
Mehrheit der Attribut &quot;rw&quot;, ist es kürzer zu schreiben:</p>
<p>
	class Heart::Gold is rw { ...</p>
<p>
Soll ein Attribut privat sein, wird es mit &quot;!&quot; (Punkt mit Wand darüber) markiert.<br />
Der automatisch erzeugte Getter ist dann eine private Methode, die nur innerhalb<br />
der Klasse benutzt werden kann. Ohne Twigil wird keine Zugriffsmethode erzeugt.<br />
Das ist auch nicht notwendig, da jedes Attribut innerhalb der Klasse einer <br />
lexikalisch lokalen Variable entspricht. Deshalb kann es auch kein gleichnamiges<br />
privates und öffentliches Attribut geben. (Innerhalb der Beispielklasse greift<br />
C&lt;$.speed&gt;, C&lt;$!speed&gt; und C&lt;$speed&gt; auf das gleiche Attribut zu.) Eine lokale<br />
Klassenvariable (kein Attribut) is jedoch möglich, wenn auch nicht empfehlenswert,<br />
es der Autor wünscht sich eine Variable die alle Instanzen der Klasse teilen. <br />
Dies hieße ebenfalls C&lt;$speed&gt;, während das Attribut weiterhin mit C&lt;$!speed&gt; <br />
in der Klasse erreichbar wäre, in der es definiert wurde. Die Befehle C&lt;my&gt; und<br />
C&lt;our&gt; haben bei I&lt;Accessoren&gt; (Getter/Setter) keinen Effekt.</p>
<p>
Der dritte neue Befehl ist C&lt;method&gt;, der selbsterklärend (anstatt C&lt;sub&gt;) eine<br />
Methode erzeugt (deklarativer Syntax). Methoden sind Routinen eines Objektes.<br />
Objekte wurde ja &quot;erfunden&quot; um Daten mit zugehörigen Routinen zusammenzufassen.<br />
Sie werden nun mit C&lt;$objekt.methode()&gt; anstatt C&lt;$objekt-&gt;methode()&gt; aufgerufen.<br />
Das spart ein Zeichen zu tippen, liest sich leichter und ist verbreiteter Standard.<br />
Mit diesem Wissen wird klar, warum C&lt;$.speed&gt; der Befehl ist, eine gleichnamige<br />
Methode zu erzeugen.</p>
<h3 id="verwendung_von_objekten">Verwendung von Objekten</h3>
<p>
Ein weiterer großer Unterschied zum Perl 5-Beispiel ist das Fehlen der Methode<br />
C&lt;new&gt;. Die wird automatisch erzeugt, da der Interpreter auf alle nötigen<br />
Informationen zugreifen kann. Bei Bedarf kann allerdings eine eigene C&lt;new&gt;-Methode<br />
oder ebenso eigene Getter/Setter erstellt werden, welche die autogenerierten<br />
Methoden überschreiben. Die Verwendung einer Klasse sieht damit so aus:</p>
<p>
	my $ufo = Heart::Gold.new();<br />
	$ufo.speed ='5c';<br />
	$ufo.stop;<br />
	# 0, da numerischer Kontext erzwungen wird<br />
	say + $ufo.speed;</p>
<p>
Die ersten beiden Schritte ließen sich sogar noch zusammenfassen:</p>
<p>
	my $ufo = Heart::Gold.new( speed =&gt;'5c'); #oder<br />
	my Heart::Gold $ufo .= new( speed =&gt;'5c');</p>
<p>
Praktischerweise kann die autogenerierte C&lt;new&gt;-Methode auch Attribute befüllen.<br />
Im zweiten Fall wird der Variable die Klasse (Protoobjekt) als Datentyp zugewiesen.<br />
Gemäß der Logik selbszuweisender Operatoren (z.B.&quot;+=&quot;) wird .new auf den Aufrufer<br />
angewendet und so entsteht ebenfalls ein Objekt. Diese Art der &quot;selbstzuweisenden&quot;<br />
Methoden wird I&lt;Mutator&gt; genannt (z.B. auch C&lt;@array .= sort&gt;). Auf diese Weise<br />
kann man ebenso Objekte durch Klonen erzeugen:</p>
<p>
	# mit alternative Paar-Konstruktor<br />
	my $arv = $ufo.clone( :speed&lt;2c&gt; );</p>
<p>
Natürlich kann ein ganzer C&lt;%Hash&gt; an Werten bei der Erzeugung übergeben werden.<br />
Dabei sieht die Syntax etwas wie Perl 5 aus, da es immer noch eine Methode namens<br />
C&lt;bless&gt; gibt, die ähnlich dem altem C&lt;bless&gt;-Befehl funktioniert.</p>
<p>
	my $klasse = class Heart::Gold { ... }<br />
	my %werte = :speed&lt;20c&gt;;<br />
	$efv = $klasse.bless( %werte );</p>
<p>
Eine Kleinigkeit fehlt aber noch: Wie erklärt man eine Methode C&lt;protected&gt;, also<br />
nicht über ein Objekt aufrufbar? (C&lt;$objekt.methode()&gt;) Genau wie man seit Perl 5<br />
Variablen auch in einem Namensraum von außen abschottet, mit C&lt;my&gt;.</p>
<p>
	class Heart::Gold {<br />
		my method secret_maneuver { ... }<br />
	}<br />
	my $ufo = Heart::Gold.new;<br />
	# Laufzeiterror:<br />
	$ufo.secret_maneuver;</p>
<p>
Mit C&lt;my&gt; lassen sich auch lexikalisch lokale Klassen deklarieren. Die benötigt<br />
man zum Beispiel, wenn Attribute selber Objekte sind, deren Klasse geheim bleiben<br />
soll. In diesem Beispiel:</p>
<p>
	class Heart::Gold {<br />
		class Movement { ... }<br />
		has int $.length where {$_ &gt;= 0};<br />
		has Movement $drive;<br />
		my method secret_maneuver { ... }<br />
	}</p>
<p>
hat ein Attribut einen vor Ort erstellten Subtyp (siehe letzte Folge), das andere<br />
ist ein Objekt (Instanz der Klasse C&lt;Movement&gt;). Da diese Klasse nicht mit C&lt;my&gt;<br />
als lexikalisch lokal deklariert wurde, ließen sich außerhalb von C&lt;Heart::Gold&gt;<br />
ebenso C&lt;Movement&gt;-Objekte erstellen. Auch prozeduraler Zugriff auf den Namensraum<br />
C&lt;Movement&gt; wäre dann möglich.</p>
<h3 id="delegier_die_arbeit">Delegier die Arbeit</h3>
<p>
Eine Klasse C&lt;Movement&gt; ist sinnvoll, da solch ein fortschrittliches Fluggerät,<br />
sicher sehr viele Eigenschaften (Attribute) und Funktionen (Methoden) besitzt.<br />
Sie alle in eine Klasse zu schreiben ginge zu Lasten der Nachvollziehbarkeit.<br />
Unser Attribut C&lt;$drive&gt;, welches das Antriebsaggregat repräsentiert, ist also<br />
ein Objekt, dessen Methoden nun Informationen über Geschwindigkeit und ähnliches<br />
herausgeben. Es erscheint als müsste nun doch ein I&lt;Getter&gt; C&lt;$.speed&gt; geschrieben<br />
werden, welcher die Methode C&lt;$drive.speed&gt; aufruft und ihr Ergebins weiterleitet.<br />
Aber auch hierfür gibt es eine kurze Schreibweise die genau dies automatisch tut.</p>
<p>
	class Heart::Gold {<br />
		has Movement $drive handles 'speed';</p>
<p>
Dieses Konzept wird in der OOP-Welt I&lt;Delegation&gt; genannt und wird natürlich wie<br />
fast alles bekannte auch von Perl 6 angeboten. Nich umsonst heißt das neue Motto:<br />
&quot;all your paradigms are belong to us&quot;.</p>
<h3 id="regelung_der_erbschaft">Regelung der Erbschaft</h3>
<p>
Somit erübrigt sich auch die Frage: &quot;Gibt es Mehrfachvererbung in Perl 6?&quot;, doch<br />
beginnen wir mit der Einfachen. Klassen vererben einander all ihre Attribute und<br />
Methoden. Das nennt man auch &quot;ableiten&quot;. So kann eine einmal geschriebene Klasse<br />
wiederverwendet und Schritt für Schritt erweitert werden. Besitzt die Elternklasse<br />
dabei eine Methoden, welche der Sprössling auch definiert, so überschreibt er<br />
damit die geerbte Methode. Ich könnte eine einfache Klasse schreiben, die den Flug<br />
von Pollen oder einer Pusteblume wiedergibt. Von dieser könnte eine nächste erben<br />
und einige Methoden zufügen, welche Manöver eines Heißluftballons beschreiben,<br />
u.s.w bis wir in sechster oder siebenter Generation einen Ufoantrieb haben der<br />
auch auf die Zeitverschiebungen bei Interdimensionsreisen eingehen kann.</p>
<p>
	class UfoDrive is AdvancedRocket {<br />
		...<br />
	}</p>
<p>
Da die &quot;Heart of Gold&quot; bekanntermaßen einen Unwahrscheinlichkeitsantrieb besitzt,<br />
der die unwahrscheinlichen Beträge auf den Rechnungen des integrierten Restaurants<br />
nutzt, muss noch von einem solchen alles vererbt werden.</p>
<p>
	class UfoDrive is AdvancedRocket is Restaurant { ... }</p>
<p>
Das ist eine Kurzschreibweise für:</p>
<p>
	class UfoDrive {<br />
		is AdvancedRocket;<br />
		is Restaurant;<br />
		...<br />
	}</p>
<p>
Es sei anzumerken, daß die Klasse I&lt;Restaurant&gt; gleichnamige Methoden der Klasse<br />
I&lt;AdvancedRocket&gt; &quot;überschreibt&quot;. In Java können Klassen als &quot;final&quot; markiert<br />
werden. Das ist in Perl 6 nicht direkt vorgesehen, jedoch kann in einem Programm<br />
mit dem Pragma C&lt;use oo :final;&gt; angewiesen werden, alle Klassen automatisch als<br />
&quot;final&quot; zu betrachten. Ausnahmen können mit</p>
<p>
	{<br />
		use class :nonfinal;<br />
		class UfoDrive { ... }<br />
		class Heart::Gold { ... }<br />
	}</p>
<p>
oder</p>
<p>
	class Insect is nonfinal { ... }</p>
<p>
angegeben werden. Einzelne Methoden, die nicht vererbt werden sollen, können als<br />
C&lt;submethod&gt; deklariert werden, die ebenfalls mit einem C&lt;my&gt; davor nicht über<br />
ein Objekt oder den Namensraum aufrufbar sind.</p>
<h3 id="rollen_die_ich_spiele">Rollen die ich spiele</h3>
<p>
Eine Rolle wird definiert wie eine Klasse, nur mit dem Schlüsselwort C&lt;role&gt;<br />
anstatt C&lt;class&gt;.</p>
<p>
	role Blinken {<br />
		has @.lichter;<br />
		method blinken { ... }<br />
	}</p>
<p>
Von einer C&lt;role&gt; kann aber kein Objekt erzeugt (geklont) werden. Wozu dient dann<br />
eine C&lt;role&gt;? Die Praxis hat gezeigt, daß mit Klassen allein der Code nicht immer<br />
einfach wiederverwendbar ist. Schnell kam es zu Bäumen von Vererbungshierarchien.<br />
Was aber tun, wollten zwei &quot;Äste eines Baums&quot; wenige Methoden gemeinsam verwenden?<br />
Selbst Sprachen, die Mehrfachvererbung kennen (nicht Java und C#) erzeugen damit<br />
neue Probleme, die mit Rollen vermieden werden können. Sie sind auch syntaktisch<br />
natürlicher und bieten sogar mehr Sicherheit ungewollte Methoden zu überlagern als<br />
Rubys I&lt;Mixins&gt;. Rollen werden während der Kompilierung in Klassen &quot;eingebunden&quot;,<br />
wenn es die Klasse fordert.</p>
<p>
	class Heart::Gold does Blinken {</p>
<p>
oder</p>
<p>
	class Heart::Gold {<br />
		does Blinken;<br />
		...<br />
	}</p>
<p>
Wie zu erahnen, besitzt nun auch die Klasse I&lt;Heart::Gold&gt; die Methode I&lt;blinken&gt;.<br />
Roles können jedoch nicht Methoden einer Klasse überlagern. Versuchen zwei Roles<br />
gleichnamige Methoden zu importieren gibt es einen Fehler beim Kompilieren, es<br />
sei denn die Klasse hatte eine gleichnamige Methode und der Konflikt muss nicht<br />
gelöst werden. Perl 6 kennt Wege wie Roles und Klassen ihre Konflikte selbst lösen<br />
können, dies würde aber den Rahmen überdehnen. Was jedoch jeder über Roles wissen<br />
sollte, der ihre Verwendung in Betracht zieht, betrifft Attribute. Roles können<br />
natürlich eigene Attribute mitbringen. Dies tat die Role im Beispiel mit:</p>
<p>
	has @.lichter; # oder:<br />
	has @!lichter; # oder:<br />
	my @!lichter; # für Klasse unsichtbar</p>
<p>
Sie könnte aber auch Attribute der Klasse mitnutzen. Das meldet sie an mit:</p>
<p>
	has @lichter;</p>
<p>
und der Kompiler prüft ob die Klasse dieses Attribut besitzt. Ein großer Nutzen<br />
der Roles kommt auch von ihrer Fähigkeit sich auch zur Laufzeit einzubinden.</p>
<p>
	$ufo does Blinken;</p>
<p>
Mehrere Roles müssen einzeln gebunden oder geklammert werden:</p>
<p>
	(($ufo does Blinken) does Tarnen);</p>
<p>
Bei diesen Fähigkeiten, gibt es auch Bedarf zur Laufzeit zu prüfen, ob eine Role<br />
in ein Objekt &quot;eingemischt&quot; wurde.</p>
<p>
	if $ufo.does(Blinken) { ... }</p>
<p>
Was in unserem Falle wahr (Bool::True) ist. Ebenso kann geprüft werden ob ein <br />
Objekt von einer Klasse abgeleitet wurde:</p>
<p>
	if $ufo.isa(Heart::Gold) { ... }</p>
<p>
Dieser Syntax ähnelt sehr Perl 5, Folgendes ist jedoch neu, auch wenn Perl 5.10 <br />
bereits smartmatch kennt:</p>
<p>
	if $ufo ~~ Blinken { ... }<br />
	if $ufo ~~ Heart::Gold { ... }</p>
<p>
Beide Fälle sind genauso wahr, da C&lt;~~&gt; eine große Tabelle hat und je nach Typ der<br />
Parameter versucht das &quot;Richtige&quot; zu tun. Solches Verhalten erreicht man durch<br />
C&lt;multi&gt;-Methoden (in vorigen Folge vorgestellt). Wenn I&lt;Roles&gt; I&lt;Multimethoden&gt;<br />
importieren, dürfen diese gleichnamig sein, solange die Signaturen nicht gleich<br />
sind.</p>
<h3 id="zeig_mir_dein_inneres">Zeig mir dein Inneres</h3>
<p>
Objekte lassen sich in Perl 6 weitaus tiefer durchleuchten als es das Smartmatch<br />
tut. C&lt;$ufo.HOW&gt; oder C&lt;^Heart::Gold&gt; erlaubt z.B. den Zugriff auf die Metaklasse<br />
und C&lt;Heart::Gold.^methods()&gt; liefert beispielsweise alle Methoden der Klasse. <br />
Doch an der Stelle möchte ich mich für dieses mal verabschieden, da die Methoden<br />
zur Introspektion (hoffentlich bald vollständig) im Tutorial der Perl-Community.de<br />
Wiki aufgelistet sind und ein Aufzählen einer API langweilig ist. Diese API ist, <br />
im Gegensatz zu dem in dieser Folge vorgestellten Syntax, keinesfalls stabil und<br />
endgültig, sodass ein Blick in den tabellarischen Index B des Tutorials sinnvoll<br />
ist. Die nächste Folge wird behandeln, was Perl einst berühmt und berüchtigt <br />
machte: die regulären Ausdrücke die jetzt wirklich regulär sind, sich nicht mehr<br />
Ausdruck nennen und auch wie Objekte behandelt werden können.</p>
<hr />
<p>
<a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_5" title="(33 months)  toc Captures und Subroutinen Willkommen zum fünften Teil dieses ausführlichen Perl 6-Tutorials, der...">Previous Chapter<!-- wiki-renamed-link Perl 6 Tutorial Part 5 --></a> | <a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial" title="(38 months) This tutorial was written for foo Perl magazine http perl-magazin.de and was published from winter 2...">Overview<!-- wiki-renamed-link Perl 6 Tutorial --></a> | <a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_7" title="(33 months)  toc Text, Rules and Grammars Willkommen zum siebenten Teil dieses poetischen Perl 6-Tutorials, da v...">Next Chapter<!-- wiki-renamed-link Perl 6 Tutorial Part 7 --></a></p>
</div>
]]></description>
<author>Herbert Breunung</author>
<guid isPermaLink="true">http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_6</guid>
<pubDate>Fri, 06 Aug 2010 23:56:07 -0000</pubDate>
</item>

</channel>
</rss>