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?
Was ist für dich eine System- bzw. selbstdefinierte Klasse? Was möchtest du damit erreichen?
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.