Кажется, что новая прагма называется parent
, которая делает примерно то же самое, что base
. Что делает parent
, что гарантирует новый (неосновный) модуль? Я что-то упустил?
В чем разница между родителем и базой в Perl 5?
Ответ 1
base
попытался сделать слишком много вещей, автоматически обрабатывая модули загрузки, а также позволяя устанавливать наследование уже загруженных классов (возможно, из файла, имя которого не было основано на имени модуля). Чтобы заставить его работать, в некоторых случаях произошел хакерство, которое вызвало неожиданные результаты. Вместо того, чтобы отменить обратную совместимость, появилась новая, прагма замены parent
с более чистой семантикой.
parent
будет основным модулем по 5.10.1.
Обновление: забыл, что base
обрабатывает fields
(если вы используете прагму fields
), которую parent
не делает.
Ответ 2
Вооружившись дополнительным битом информации из ysth, я смог увидеть различия в документах:
base
pragma выполняет следующие действия:
- добавляет именованный пакет в
@ISA
- загружает модуль с тем же именем, что и именованный пакет, используя
require
(если он не обнаружит, что пакет уже загружен) - не будет работать, если модуль с тем же именем, что и пакет, не существует
- умирает, если в именованном пакете нет символов
- Если
$VERSION
не существует в именованном пакете, база устанавливает его в"-1, set by base.pm"
- инициализирует
fields
именованного пакета, если они существуют - не вызывает функцию импорта именованного пакета
parent
pragma выполняет следующие действия:
- добавляет именованный пакет в
@ISA
- загружает модуль с тем же именем, что и именованный пакет, используя
require
- принимает параметр, который сообщает ему, что он не умирает, если модуль с тем же именем, что и пакет, не существует