Ruby: attr_accessor generierte Methoden - wie man sie iteriert (in to_s - benutzerdefiniertes Format)?

8

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:

  1. 'id' kann leichte Kopfschmerzen verursachen - da Objekt bereits eine 'id' zu haben scheint.
  2. Der obige c.methods-Aufruf gibt Strings zurück - ich bekomme keine anderen Metadaten? (In Java 'Methode' ist ein Objekt, wo ich weitere Überlegungen durchführen könnte.)
  3. Ich habe Eins-zu-viele-Beziehungen, mit denen ich mich befassen muss ('c' ist ein Array-Typ anderer Objekttypen).

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.

    
monojohnny 07.01.2010, 12:24
quelle

2 Antworten

13

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:

%Vor%

Für Problem 3 können Sie einfach

tun %Vor%     
sepp2k 07.01.2010, 12:42
quelle
0

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.

Die

to_json -Implementierung basiert auf dieser Antwort

%Vor%     
Vadym Tyemirov 26.11.2013 04:13
quelle

Tags und Links