Как вы можете создать дамп экземпляра объекта с помощью новой функции класса Perl?

Цель состоит в том, чтобы увидеть инкапсулированные данные, как я и делал последние 26 лет.

use 5.040;
use strictures;
use experimental 'class';

class Foo {
    field @member = qw(e r t);
}

my $foo = Foo->new;

# use Data::Dumper qw(Dumper);
# say Dumper $foo;
# cannot handle ref type 16

# use DDS; DumpLex $foo;
# _dump_rv() can't handle 'OBJECT' objects yet

# use Data::Dx; Dx $foo;
# Can't handle OBJECT data

# use DDP; p $foo;
# Foo  {
#     public methods (1): new
#     private methods (0)
#     internals: (opaque object)
# }
#                ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
219
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если вы хотите использовать class, который специально разработан так, чтобы вы не могли заглянуть в его внутренности, вы также не сможете сбрасывать его с помощью внешних модулей. Вам придется что-то добавить в класс, чтобы выгрузить вещи, а это большая дополнительная работа. В целом я не думаю, что class — это хорошая идея, и такого рода препятствие на пути практического развития — одна из причин, по которой я так считаю.

Я также рассматриваю отсутствие интерфейса проверки как препятствие для использования функции «класса» в моих проектах.

Однако универсальная поддержка отладчиками и дамперами не является невозможной. Ему просто придется подождать, пока не станет доступен протокол метаобъектов (MOP) для функции «класс». Конечно, после этого еще предстоит поработать над его использованием.

Для модуля CPAN Object::Pad , который является своего рода испытательным стендом для этой функции, имеется MOP и базовая поддержка Data::Printer . Также есть доказательство концепции, как проверять объекты Object::Pad с помощью отладчика Perl.

Из доступных модулей Data::Dumper не является хорошим кандидатом для проверки данных инкапсулированного класса: по широко распространенной привычке он предоставляет действительный код Perl, который может конструировать данные. Однако это обычно невозможно ни с объектами типа «класс», ни с объектами Object::Pad. Модулям, которые не связаны ожиданием выполнения туда и обратно, просто необходимо реализовать MOP.

Data::Dumper выводит Perl-код потому, что он это делает, а не из-за привычки или какого-то странного способа, которым люди злоупотребляют. Но несмотря на это, Data::Dumper довольно хорошо служил людям на протяжении десятилетий, отсюда и вопрос.

brian d foy 13.06.2024 22:12

Извините, если это прозвучало неправильно: я не хотел подразумевать неправильное использование или странность. Data::Dumper и две из перечисленных альтернатив, DDS и Data::Dx , используют код Perl в качестве выходного формата. Внутренности объектов «класса» не могут отображаться как действительный код Perl. Однако людям не обязательно нужен код Perl, чтобы увидеть инкапсулированные данные. Вот почему такие модули, как DDP, которые не выводят код Perl, лучше подходят для решения проблемы ОП.

haj 14.06.2024 10:50
Ответ принят как подходящий

Пакет Tuple::Munge на CPAN может вам помочь.

use v5.38;

sub tuple_to_aref ( $t ) {
    use Tuple::Munge ();
    use experimental 'builtin';
    use builtin 'blessed';
    my $len = Tuple::Munge::tuple_length($t);
    my $aref = [ map Tuple::Munge::tuple_slot($t, $_-1), 1 .. $len ];
    if ( my $class = blessed $t  ) {
        return bless( $aref, "TUPLE_TO_ARRAY::$class" );
    }
    return $aref;
}

use experimental 'class';
use Data::Dumper;

class My::Class {
    field $x;
    ADJUST {
        $x = 'Foobar';
    }
}

my $object = My::Class->new;
print Dumper( tuple_to_aref( $object ) );

Пример вывода:

$VAR1 = bless( [
                 \'Foobar'
               ], 'TUPLE_TO_ARRAY::My::Class' );

Это дает вам ссылку на массив, но не сообщает, какому полю принадлежит элемент массива. Это лучше, чем ничего, но для объекта средней сложности это неудовлетворительно. Вы можете рассмотреть возможность демонстрации результатов вашей программы, чтобы люди могли видеть, что они на самом деле получают.

brian d foy 13.06.2024 22:08

Не указано, к какому полю принадлежит элемент массива, это то, что он имеет общего с любыми объектами Perl, не имеющими хеш-ссылок, например, с объектами, основанными на благословенных ссылках на массив. Однако добавил образец вывода.

tobyink 21.06.2024 10:34

Если я решу использовать ссылку на массив в качестве основы для моего объекта, я могу выбрать порядок элементов. И люди могут проверить источник, чтобы увидеть, что и куда пошло. С новыми объектами не так уж и много.

brian d foy 26.06.2024 01:35

Другие вопросы по теме