Почему Scalar :: Util :: reftype возвращает `undef` вместо пустой строки? - PullRequest
3 голосов
/ 23 апреля 2019

ref возвращает пустую строку для скалярных значений.

Почему Scalar::Util::reftype возвращает undef вместо пустой строки, как ref делает?

В чем выгода undef? Для сравнения, преимущество пустой строки заключается в меньшем кодировании при выполнении:

reftype $data eq 'HASH'

Когда undef возвращается, мы получим Use of uninitialized value while eq at ..., и мы должны сделать:

(reftype($data) //'') eq 'HASH'

1 Ответ

5 голосов
/ 23 апреля 2019

Вообще говоря, неправильный ввод приводит к undef (если не исключение), что (в конечном итоге) приводит к предупреждению, так что ошибка может быть найдена.

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

Я оспариваю ваше утверждение, что это делает код меньше.Для начала, никогда не следует использовать reftype, поскольку это нарушает модель данных Perl.(Вот почему keys $ref всегда была плохой идеей и никогда не выходила за рамки экспериментальной стадии.) Это означает, что объем рассматриваемого кода довольно мал.

Тем не менее, может иметь смысл создавать данные, которыетребует его использования, если гарантированы определенные ограничения.(Например, вывод decode_json может потребовать его использования, и его можно безопасно использовать, потому что decode_json никогда не будет генерировать объекты или магические переменные.) Когда это необходимо, обычно выполняется ряд проверок, поэтому возвращаетсяпустая строка на самом деле не помогает.

my $type = reftype($val);
if (!defined($type)) { ... }
elsif ($type eq 'HASH') { ... }
elsif ($type eq 'ARRAY') { ... }
...

Обратите внимание, что изменение reftype нарушит этот код, поэтому изменение reftype не вариант.Я собирался сказать, что вы могли бы попросить у автора альтернативный сабвуфер, который ведет себя так, как вы хотите, но вы могли бы так же легко создать этот саб сам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...