Появляется новая прагма с именем parent
, которая делает примерно то же самое, что и base
. Что делает parent
, что требует нового (неосновного) модуля? Я что-то упустил?В чем разница между родителем и базой в Perl 5?
ответ
base
пытался сделать слишком много вещей — автоматически обрабатывал модули загрузки, но также позволял устанавливать наследование из уже загруженных классов (возможно, из файла, имя которого не было основано на имени модуля). Чтобы заставить его работать, в некоторых случаях произошел хакерство, которое вызвало неожиданные результаты. Вместо того, чтобы отменить обратную совместимость, появилась новая, заменяющая прагма parent
с более чистой семантикой.
parent
будет основным модулем по состоянию на 5.10.1.
Update: забыл, что base
обрабатывает fields
(если вы используете fields
прагму), который parent
не делает.
Вооруженная дополнительный бит информации из ysth, я был в состоянии увидеть различия в документации:
base
Прагма делает следующие вещи:
- добавляет указанный пакет в
@ISA
- загружает модуль с тем же именем, что и именованный пакет, с использованием
require
(если он не обнаружит, что пакет уже загружен) - не будет работать, если модуль с th е же имя пакета не существует
- плашки, если нет символов в имени пакета
- если
$VERSION
не существует в имени пакета, база устанавливает его"-1, set by base.pm"
- инициализирует
fields
названного пакета если они существуют - не вызывает функцию импорта названного пакета
parent
прагма делает следующие вещи:
- добавляет указанный пакет в
@ISA
- загружает модуль с тем же именем, что и с именем пакета, используя
require
- принимает вариант, который говорит ему, чтобы не умереть, если модуль с тем же именем, что и пакет Безразлично» t существует
Почти. Опция norequire просто говорит ей не выполнять require (поэтому класс уже должен быть загружен). Это означает, что он не должен ловить ошибки и решать, следует ли их подавлять или нет. – ysth
Кроме того, сравните perl -wE'say require base 'to perl -wEsa require parent' – ysth