Perl 5中父级和基础有什么区别?

Cha*_*ens 48 perl subclass pragma

似乎有一个新的pragma命名parent与大致相同的东西base.这样parent做可以保证一个新的(非核心)模块?我错过了什么?

yst*_*sth 51

base试图做太多事情 - 自动处理加载模块,但也允许从已经加载的类(可能来自名称不是基于模块名称的文件)建立继承.为了使其有效,有些hackery在某些情况下会导致令人惊讶的结果.不是打破向后兼容性,而是parent使用更清晰的语义引入了一个新的替换pragma .

parent 将成为5.10.1的核心模块.

更新:忘记了base句柄fields(如果你使用的是fieldspragma),但是parent没有.

  • 另外,比较perl -wE'say需要base'到perl -wE'say require parent' (24认同)

Cha*_*ens 37

有了ysth的额外信息,我能够看到文档中的差异:

basepragma执行以下操作:

  • 将命名包添加到 @ISA
  • 使用与命名包相同的名称加载模块require(除非它检测到包已经加载)
  • 如果与包名称相同的模块不存在,则不会失败
  • 如果命名包中没有符号,则会死亡
  • 如果$VERSION在命名包中不存在,则base将其设置为"-1, set by base.pm"
  • 初始化fields命名包的存在(如果存在)
  • 不会调用命名包的导入功能

parentpragma执行以下操作:

  • 将命名包添加到 @ISA
  • 使用与命名包相同的名称加载模块 require
  • 如果与包不同的模块不存在,则接受一个告诉它不会死的选项

  • 几乎.norequire选项只是告诉它不要执行require(因此必须已经加载了类).这意味着它不必捕获错误并决定是否应该抑制它们. (4认同)