跳轉到內容

使用 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 位於繼承鏈的底部。

華夏公益教科書