ruby: Woran kann man selbstdefinierte Klassen erkennen?

OP #3035168
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.
Angehängte Dateien:
Admin Persönliche Seite #3035246
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.
OP #3035261
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren