Re: Verhalten von Modulen und Mixins

"Florian G. Pflug" <[email protected]> Sun, 26 Jan 2003 04:49:26 +0100
Newsgroups gmane.comp.lang.ruby.german
Message-ID <[email protected]>
On Sat, Jan 25, 2003 at 01:08:52PM -0500, [email protected] wrote:
> Mit anderen Worten: was wir "Klassenmethoden" nennen, sind im
> Wesentlichen Singleton-methoden eines Objects -- und zwar, eines
> Objects, dessen Klasse "Class" ist.
Yep... 

Und was wir instantmethoden nennen sind methoden eines Objects, dessen
Klasse die oben genannte singleton-klasse ist. Diese singleton-ableitung von
class, die die klassenmethoden enthält wird metaklasse genannt.

class Foo
end
foo = Foo::new

jetzt ist:
foo:
----
Klasse: Foo
Instanzvariablen: <list der instanzvariablen>

Foo:
----
Klasse: Foo-Metaclass
Instanzvariablen: <list der klassenvariablen von foo>
Methoden: <liste der instanzmethoden von Foo bzw foo>

Foo-Metaclass:
--------------
Klasse: Class
Instanzvariablen: <keine??>
Methoden: <liste der klassenmethoden von Foo>


Man kann mit diesen Dinge ein paar lustige Sachen anstellen - die
include/extend sache is eine davon. Eine eine ist eine witztige methoden
klassenmethoden zu definieren.

class Foo
	class <<self
		def Bar
			puts "foobar
		end
	end
end

Foo::Bar #gibt "foobar" aus.

Was ist passiert?
Innerhalb der Klassendefinition von Foo ist "self" eine Referenz auf das
Object, das die Klasse Foo repräsentiert.

Mit "class <<aObject" kann man einem object methoden hinzufügen. Dabei wird
intern eine anonyme subklasse der Klasse von aObject gebildet, in welche die
methoden eingefügt werden.

"class <<self" erzeugt daher eine anonyme ableitung der Klasse von Foo, also
der Foo-Metaclass. Nun ist aber die Metaclass sowieso schon eine anonyme
ableitung von Class, daher wird nicht nochmal abgeleitet, sondern gleich die
metaklasse verwendet. In diese werden die methoden eingetragen, die
innerhalb von "class <<self" deklariert werden, und diese werden damit zu
Klassenmethoden.

greetings, Florian Pflug

PS: An [email protected]:
Ich kann dir keine direkte mail schicken, deshalb hab ichs jetzt auf die
Liste geposted. Ich hab ne isdn-dialup-leitung (allerdings flat-rate), und
verwende _keinen_ smtp smarthost. Der mailserver deines providers hat meine
mail rejected, weil er mails die direkt von dialup-usern kommen (und nicht
über den mailserver des providers gehen) block. Diese ip-addressen entnimmt
der mailserver der DUL (dial-up-list), zu finden auf www.mail-abuse.org
Damit soll wohl spam verhindert werden - allerdings auf die brutale tour ;-)

Dachte du solltest wissen, daß du von machen menschen
e-mail-mäßig nicht erreicht werden kannst.