В чем разница между родителем и базой в Perl 5? - PullRequest
47 голосов
/ 18 мая 2009

Похоже, есть новая прагма с именем parent, которая делает примерно то же самое, что base. Что означает parent, что гарантирует новый (не основной) модуль? Я что-то упустил?

Ответы [ 2 ]

50 голосов
/ 18 мая 2009

base пытался сделать слишком много вещей & ndash; автоматическая обработка загружаемых модулей, но также позволяющая установить наследование от уже загруженных классов (возможно, от файла, имя которого не основано на имени модуля). Чтобы заставить это работать, была некоторая хакерская атака, которая в некоторых случаях вызывала удивительные результаты. Вместо того, чтобы нарушать обратную совместимость, была представлена ​​новая, заменяющая прагма parent с более чистой семантикой.

parent будет основным модулем с 5.10.1.

Обновление: забыл, что base обрабатывает fields (если вы используете прагму fields), чего parent не делает.

37 голосов
/ 18 мая 2009

Вооружившись дополнительной информацией от YSTH, я смог увидеть различия в документах:

Прагма base выполняет следующие действия:

  • добавляет указанный пакет к @ISA
  • загружает модуль с тем же именем, что и указанный пакет, используя require (если он не обнаруживает, что пакет уже был загружен)
  • не выйдет из строя, если модуль с тем же именем, что и пакет, не существует
  • умирает, если в названном пакете нет символов
  • если $VERSION не существует в именованном пакете, база устанавливает его на "-1, set by base.pm"
  • инициализирует fields указанного пакета, если они существуют
  • не вызывает функцию импорта именованного пакета

Прагма parent выполняет следующие действия:

  • добавляет указанный пакет к @ISA
  • загружает модуль с тем же именем, что и указанный пакет, используя require
  • принимает опцию, которая говорит ему не умирать, если модуль с тем же именем, что и пакет, не существует
...