使用Mason2。有 3 个组件。
/Base.mc
/tmp/Base.mc
/tmp/index.mc
有/tmp/index.mc
一个内容:
hello from <% $m->request_path %></br>
<% $.Some %>
是$.Some
在 中定义的方法/Base.mc
:
<%augment wrap><% inner() %></%augment>
<%method Some>
The default "Some" method defined in the <% __PACKAGE__ %>
</%method>
/tmp/Base.mc
仅包含
<%augment wrap><% inner() %></%augment>
要求/tmp/index
打印:
hello from /tmp/index
The default "Some" method defined in the MC0::Base_mc
现在将Some
方法添加到/tmp/Base.mc
<%method Some>
Redefined "Some" method in <% __PACKAGE__ %>
</%method>
再次请求/tmp/index
,它打印:
hello from /tmp/index
Redefined "Some" method in MC0::tmp_Base_mc
它尊重Some
包装中重新定义的方法/tmp/Base.mc
问题是:
如果 Mason 允许重新定义上述方法,那么 的目的是<%override method>
什么?有<%override Some>
什么不同吗?(当我测试时,它打印相同)。
编辑也许问题可以简化为以下 perl 代码。
use 5.014;
use warnings;
package My;
use Moose;
sub some { say "some from " . __PACKAGE__ }
package My2;
use Moose;
extends 'My';
sub some { say "another some from " . __PACKAGE__ }
#the above line is an correct way to refefine a sub "some"?
#so don;t need to use the
#override 'some' => sub { say "another some from " . __PACKAGE__ };
package main;
use My2;
my $m = My2->new();
$m->some();
在这两种情况下(例如“plain”重新定义和用“override”重新定义)打印:
another some from My2
所以,唯一的区别是调用withsuper()
的可能性?抱歉,如果我错过了一些基本知识... ;(some
override