Каковы допустимые возвращаемые значения модуля Perl? - PullRequest
16 голосов
/ 07 декабря 2009

Обычной практикой в ​​Perl, конечно же, является завершение модулей с 1;, чтобы затем запрос на запрос мог быть проверен на успешность. Есть ли причина, по которой возвращаемое значение не может быть другим истинным значением? В моем тестировании не было проблем правда).

Редактировать: По общему мнению, и поскольку он будет работать только один раз (хороший совет), пример кода пропал. Кажется, консенсус заключается в том, что безопасно возвращать любое истинное значение, но никогда не полагаться на это значение в вызывающем коде, поскольку require вернет 1 после первой загрузки

Ответы [ 6 ]

17 голосов
/ 08 декабря 2009

Некоторое время я кладу глупости в мои модули. Там нет никакого вреда, и это маленькое пасхальное яйцо. uny2k полезно заканчивается "Yes, this code is a joke." Class :: Fields переполнен ими.

Если сделать еще один шаг вперед, иногда, когда задокументирована функция, возвращающая true и false, я верну что-то, отличное от 1, для true. Это наказать людей, которые пишут if foo() == 1, когда они означают if foo(). Это было примерно в то же время, когда я писал use constant TRUE => 1==1; use constant FALSE => !TRUE;

Я видел возвращаемое значение модуля, используемого в производственном коде. Я не помню точно, почему. Логика разработчика была ... замучена. Я считаю, что это было что-то вроде нежелания писать только одну строку вместо двух. Я не помню, почему он не просто экспортировал это.

Это был тот же разработчик, который использовал %_ для передачи аргументов (символ *_ является глобальным для пакетов ) и написал 150 операторов линейной карты внутри операторов map.

Опасность использования возвращаемого значения, кроме запутывания, состоит в том, что оно работает только один раз.

$ cat Foo.pm
package Foo;

return "Basset hounds got long ears";

$ cat test.plx
#!/usr/bin/perl -w

print require Foo, "\n";
print require Foo, "\n";

$ perl -I. test.plx
Basset hounds got long ears
1

Первый вызов require оценивает Foo.pm и возвращает возвращаемое значение. Второй вызов видит его уже в %INC и просто возвращает true. И вы даже не можете быть уверены, что первым делом требуется код. Вы можете обойти это с помощью do "Foo.pm", но теперь вы каждый раз перезагружаете модуль с предупреждениями о переопределенных подпрограммах, проблемах с производительностью и, возможно, повторной инициализации глобальных переменных. Это не стоит того.

8 голосов
/ 07 декабря 2009

Я думаю, (1) нет проблем с возвратом любого произвольного истинного значения из вашего модуля, но (2) есть большая проблема с неясным, слишком умным кодом, который вы предлагаете использовать для реализации деталей реализации модуля , Не делай этого.

7 голосов
/ 07 декабря 2009

Все, что является допустимым возвращаемым значением. Если вы хотите, чтобы require был успешным, это должно быть истинное значение. Если вы не хотите, чтобы require был успешным (например, неподдерживаемая платформа, отсутствующая библиотека), используйте ложное значение.

Чтобы увидеть, что другие люди использовали в качестве возвращаемых значений, посмотрите Acme :: ReturnValue .

Люди не ожидают, что возвращаемое значение будет использоваться для чего-либо, поэтому я не стал бы путать людей, пытаясь это сделать, какими бы умными они ни были в то время. :)

6 голосов
/ 07 декабря 2009

Марк Доминус , автор Perl высшего порядка , объясняет мой любимый:

Я очень редко использовал $flag = 'Cogito ergo sum';, который, как все знает самоочевидно верно во всех возможных вселенных. Это обеспечивает максимальная переносимость.

4 голосов
/ 07 декабря 2009

Цель состоит в том, что если ваш модуль возвращает false, то в этой точке может произойти сбой запроса. Никто не заботится и не полагается на то, что ценность за пределами этого является истинной или ложной.

Ты должен последовать этому примеру. Вы делаете так, чтобы ваши модули зависели от фактического значения, вне зависимости от того, является ли оно истинным или ложным. Например, в приведенном вами примере, если ваше требование возвращает 1, требование будет выполнено успешно, но ваш умный конструктор потерпит неудачу.

1 голос
/ 07 декабря 2009

Одна вещь, с которой вы столкнетесь с require, это то, что она возвращает возвращаемое значение модуля только при первой загрузке модуля. Если модуль уже был загружен, require возвращает 1, не загружая модуль снова.

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

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