Forum: PC-Programmierung ruby: Woran kann man selbstdefinierte Klassen erkennen?


von Uhu U. (uhu)


Lesenswert?

Ich möchte testen, ob ein Objekt einer Systemklasse, oder einer 
selbstdefinierten Klasse angehört.

Die Brutalmethode wäre ein Vergleich von obj.class gegen die 
Systemklassen.

Gibt es eine elegantere Methode?

: Verschoben durch Admin
von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Was ist für dich eine System- bzw. selbstdefinierte Klasse? Was möchtest 
du damit erreichen?

von Uhu U. (uhu)


Angehängte Dateien:

Lesenswert?

Was ich erreichen will: Eine Funktion, der man die Namen von globalen 
Variablen übergibt und die daraus Ruby-Code erzeugt, den man zum 
Wiederherstellen der Variablen einfach ausführt.

Ich hatte natürlich Marshal, oder yaml nehmen können, ich wollte aber 
eine Lösung, die lesbare Daten erzeugt.

Problem war, zu entscheiden, wann ich Objekte Spezialbehandlungen 
programmieren muß und wann es mit den einfachen to_s geht - die Frage 
nach den selbstdefinierten Klassen umreißt das Ganze eher schlecht.

Ich habe das Problem mittlerweile einigermaßen gelöst - siehe Anhang. 
Die Lösung für Klassen-Objekte im letzten else-Zweig ist wenig getestet 
und die Abfrage, ob es Instanzvariablen gibt, ist ein Notbehelf, der bei 
Struct-Abkömmlingen schon versagt; die werden deshalb schon vorher 
explizit abgehandelt.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Du willst also direkt Ruby-Code erzeugen, wenn ich das richtig sehe. Das 
wird nie vollständig transparent für alle Objekte funktionieren, weil du 
nicht weißt wie die initialize-Methode einer Klasse aussieht; du musst 
also sowieso jede Klasse speziell behandeln. Aber welchen Sinn soll das 
haben, Ruby-Code zu erzeugen? Das ist ja nun nicht gerade portabel, und 
es gibt etablierte Alternativen wie YAML und JSON.

Globale Variablen sind außerdem keine gute Idee und hier völlig unnötig.

von Uhu U. (uhu)


Lesenswert?

Andreas Schwarz schrieb:
> Globale Variablen sind außerdem keine gute Idee und hier völlig unnötig.

Für kleine Skripte, die einen Zustand fortschreiben sollen, ist das 
völlig ausreichend.

Außerdem läßt sich das Prinzip natürlich auch auf irgend einen Container 
umbauen.

Wichtig ist mir, daß die Datei mit den Zustandsinformationen leicht 
lesbar ist, daß man der ganzen Chose zwischendurch "auf die Finger 
gucken" kann, ohne große Verrenkungen machen zu müssen.

> Das wird nie vollständig transparent für alle Objekte funktionieren,
> weil du nicht weißt wie die initialize-Methode einer Klasse aussieht;

Das versuche ich mit dem Trick mit dem instance_exec in einem mit 
allocate - also uninitialisiert erzeugten Objekt - zu umschiffen. Das 
funktioniert, so lange der Zustand des Objektes vollständig in 
Instanzvariablen gespeichert ist.

Für diese Klassen kommt dann was in diesem Stil heraus:
1
$global = MyClass.allocate.instance_exec { @a,@b,@c = 1,2,3; self; }

Außerdem: YAML & Co. kriegen das ja irgendwie auch hin.

> Das ist ja nun nicht gerade portabel

Wieso das?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.