ruby: Woran kann man selbstdefinierte Klassen erkennen?

OP #3035168
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
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
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.