1

いくつかの複雑なオブジェクト構造があり、Data::Printer を使用してそれらを調べています。オブジェクト (コンテナ) に別のオブジェクト (子) であるフィールドがある場合、子は DDP の出力にクラス名としてのみ表示されます。子の文字列化された値も見たいです。

例を見てみましょう:

{
    package Child;
    use Moo;

    use overload '""' => "stringify";

    has 'value', is => 'ro';

    sub stringify {
        my $self = shift;
        return "<Child:" . $self->value . ">";
    }

}

{
    package Container;
    use Moo;

    has 'child', is => 'ro';
}

my $child_x = Child->new(value => 'x');
print "stringified child x: $child_x\n";

my $child_y = Child->new(value => 'y');
print "stringified child y: $child_y\n";

my $container_x = Container->new(child => $child_x);
my $container_y = Container->new(child => $child_y);

use DDP;
print "ddp x: " . p($container_x) . "\n";
print "ddp y: " . p($container_y) . "\n";

出力:

stringified child x: <Child:x>
stringified child y: <Child:y>
ddp x: Container  {
    Parents       Moo::Object
    public methods (2) : child, new
    private methods (0)
    internals: {
        child   Child                  # <- note this
    }
}
ddp y: Container  {
    Parents       Moo::Object
    public methods (2) : child, new
    private methods (0)
    internals: {
        child   Child                  # <- and this
    }
}

ご覧のとおり、子は出力で区別できません。クラス名に加えて、またはクラス名の代わりに、その場所で文字列化を確認したいと思います。

4

2 に答える 2

2

Dave が指摘したように、Data::Printer をインポートするときにフィルターを定義できます。

use DDP filters => {
    'Child' => sub { "$_[0]" }
};

さらに良い方法は、_data_printer機能を使用することです (DDP をインポートするたびにフィルター定義を入力するのは面倒なので)。

{
    package Child;
    ...

    sub _data_printer {
        my $self = shift;
        return "$self";
    }
}

どちらの方法でも、文字列化された値が内部に表示されます。

ddp x: Container  {
    Parents       Moo::Object
    public methods (2) : child, new
    private methods (0)
    internals: {
        child   <Child:x>
    }
}
于 2013-07-02T14:20:00.873 に答える