Ich brauche eine Klasse, die eine halbautomatische "to_s" -Methode hat (um XML tatsächlich zu erzeugen). Ich würde gerne alle automatischen Methoden durchlaufen, die in meiner 'attr_accessor'-Zeile eingerichtet sind:
%Vor%Bisher mache ich ein Basic:
%Vor%Ich stehe vor einigen Herausforderungen:
Das ist, was ich versuche zu tun: Ich möchte ein einfaches Objekt entwerfen, das ein 'to_s' hat, das ein XML-Fragment aufbauen wird: zum Beispiel.
%Vor%Und dann vererben Sie meine Daten-Klassen von diesem einfachen Objekt: so dass (hoffentlich) ich einen Mechanismus erhalte, ein komplettes XML-Dokument aufzubauen.
Ich bin mir sicher, dass ich auch hier das Rad neu erfinde ... also sind andere erprobte Ansätze willkommen.
Um Methodenobjekte aus einer Zeichenfolge abzurufen, können Sie die Methoden method
oder instance_method
verwenden (wobei method
für ein Objekt und instance_method
für eine Klasse aufgerufen würde). Die einzige interessante Information, die es Ihnen gibt, ist Arity (im Gegensatz zu Java, wo es Ihnen auch die Typen des Rückgabewerts und der Argumente geben würde, was natürlich in Ruby nicht möglich ist).
Ihr Titel legt nahe, dass Sie nur über Methoden, die von attr_accessor
erstellt wurden, iterieren wollen, aber Ihr Code wird über jede in Ihrer Klasse definierte Methode iterieren, was zu einem Problem werden könnte, wenn Sie zusätzliche Methoden hinzufügen wollten Klasse.
Um dieses Problem und das Problem mit id
loszuwerden, könntest du deinen eigenen Wrapper um attr_accessor
verwenden, der speichert, für welche Variablen er Accessoren erstellt hat, etwa so:
Für Problem 3 können Sie einfach
tun %Vor% Ich verwende diese Technik, um benutzerdefinierte Objekte in JSON zu konvertieren. Möglicherweise ist das folgende Snippet hilfreich, da die Frage für to_xml
implementation war.
Es gibt ein wenig Magie hier mit self.included
in einem Modul. Hier ist ein sehr schöner Artikel aus dem Jahr 2006 über Module mit Instanz- und Klassenmethoden Ссылка
Das Modul ist so konzipiert, dass es in jede Klasse aufgenommen werden kann, um to_json
-Funktionalität bereitzustellen. Es fängt attr_accessor
method ab und verwendet nicht seine eigenen, um minimale Änderungen für existierende Klassen zu verlangen.
to_json
-Implementierung basiert auf dieser Antwort
Tags und Links ruby xml reflection