跳转到内容

使用 Moose 编程/语法/extends

来自维基教科书,开放的书籍,开放的世界

使用 extends 关键字覆盖继承链,只设置您指定的那些部分。Extends 既消除了问题也带来了问题,应该经常使用,但在从非 Moose 迁移到 Moose 时要谨慎使用。

使用 extends 时要注意的一点是使用 use base。CORE 模块“base”不会覆盖(重写)继承链,而是向其添加内容。Moose 的作者 Steven 将此识别为问题区域,即使某些功能有时依赖于“问题”。Extends 强制线性继承链(除非另有指定),这意味着链中的最后一个模块必须通过定义要么 use Moose,要么 push @ISA,'Moose::Object'。如果这两个条件都不满足,您将收到混淆的错误,告诉您关键字(纯 Perl5 函数)未定义。

use Moose 的指令指示 Moose 自动将 @ISA 设置为从 Moose::Object 继承。@ISAextends 的使用覆盖。

module A - module B - module C
  1. A extends B
  2. B extends C
  3. C 必须要么 use Moose,要么 use base 'Moose::Object'

Class::Accessor

[编辑 | 编辑源代码]

extends 问题的罪魁祸首通常是 Class::Accessor,或者 Moose 团队所称的遗留垃圾。Class::Accessor 通常在基类中使用,如下所示

use base qw/Class::Accessor/;

BEGIN { Class::Accessor::mk_accessors( qw/ foo bar baz / ) };

这会导致将 Class::Accesssor 推送到 @ISA(继承链)上,但它仍然将 Moose 排除在外。Moose 期望 Moose::Object 位于继承链的底部。

华夏公益教科书