Wie kann ich das Rendering von Objekten in einem Longmess anpassen?

8

Wir bauen unsere große Perl-Anwendung langsam auf objektorientierte Schnittstellen um, insbesondere für Datenmodelle. Der nervige Teil ist, dass Stack-Traces weniger nützlich sind. Um ein konstruiertes Beispiel zu geben: Vorher.

%Vor%

Nachher.

%Vor%

Nun kann ich nicht sehen, welcher Benutzer an foo() übergeben wurde, ich sehe nur den Klassennamen (der bereits dokumentiert ist) und eine Speicheradresse eines Objekts.

Ich habe versucht, einen Stringification-Operator für die Modellklasse mit overload.pm zu installieren:

%Vor%

Aber das hat keinen Einfluss auf die Longmess. Was ich möchte, ist etwas in der Art:

%Vor%

Das heißt, der erste Parameter für foo() sollte mit der Methode stringify() des Objekts angezeigt werden. Wie kann ich das erreichen?

    
Stefan Majewsky 23.08.2013, 08:52
quelle

1 Antwort

11

Das Problem ist in diesem Teil von Carp.pm :

%Vor%

Das heißt, wenn ein Argument ein überladenes Objekt sein könnte, dann wird jede Überladung der Zeichenketten mit dem StrVal Helfer , wodurch die Standard-Stringifizierung erzwungen wird.

Leider gibt es dafür keinen direkten Weg. Alles, was wir tun können, ist affe-patchen die Carp::format_arg sub, z. B.

%Vor%

Wie es ist, ist dies unelegant und sollte in ein Pragma gebracht werden:

Datei Carp/string_overloading.pm :

%Vor%

Dann der Code

%Vor%

Ausgänge:

%Vor%     
amon 23.08.2013, 09:43
quelle

Tags und Links