首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mason方法范围-覆盖

Mason方法范围-覆盖
EN

Stack Overflow用户
提问于 2014-09-20 09:13:36
回答 1查看 298关注 0票数 4

使用Mason2。有3个组件。

代码语言:javascript
复制
/Base.mc
/tmp/Base.mc
/tmp/index.mc

具有以下内容的/tmp/index.mc

代码语言:javascript
复制
hello from <% $m->request_path %></br>
<% $.Some %>

$.Some是在/Base.mc中定义的方法。

代码语言:javascript
复制
<%augment wrap><% inner() %></%augment>

<%method Some>
The default "Some" method defined in the <% __PACKAGE__ %>
</%method>

/tmp/Base.mc只包含

代码语言:javascript
复制
<%augment wrap><% inner() %></%augment>

请求/tmp/index打印:

代码语言:javascript
复制
hello from /tmp/index
The default "Some" method defined in the MC0::Base_mc

现在将Some方法添加到/tmp/Base.mc

代码语言:javascript
复制
<%method Some>
Redefined "Some" method in <% __PACKAGE__ %>
</%method>

再次请求/tmp/index,它打印:

代码语言:javascript
复制
hello from /tmp/index
Redefined "Some" method in MC0::tmp_Base_mc

它遵守包装的Some中重新定义的/tmp/Base.mc方法。

问题是:

如果Mason允许像上面那样重新定义方法,那么<%override method>的目的是什么?<%override Some>有什么不同吗?(当我测试时,它打印的是相同的)。

编辑,也许这个问题可以简化为下面的perl代码。

代码语言:javascript
复制
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();

在这两种情况下(例如“平原”重新定义和使用“覆盖”重新定义)打印:

代码语言:javascript
复制
another some from My2

因此,唯一的区别是在some中使用override调用override的可能性?如果我错过了一些基本的知识..。;(

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-21 07:55:23

梅森中的override实现了Moose中的方法修饰符override;Moose的override是用于重写父方法的标准OO方法的语法糖,但如果该方法使用参数,则有一些限制。来自override

重写'display_name‘=> Sub{ my $self = shift;返回$self()。q{,}$self->title();}; 对super()的调用几乎与调用$self->SUPER::display_name相同。不同之处在于,传递给超类方法的参数将始终与传递给方法修饰符的参数相同,且不能更改。传递给super()的所有参数都会被忽略,在调用@_之前对super()所做的任何更改也会被忽略。

为了从上面的Moose类中给出一个例子,让我们给some一些参数:

代码语言:javascript
复制
package My;
use Moose;
sub some {
    my $self = shift;
    say "   " . __PACKAGE__ . " method 'some' args: " . join " ", @_;
}

在创建My对象并调用$obj->some('pip', 'pop')之后输出

代码语言:javascript
复制
My method 'some' args: pip pop

现在让我们来看看My2。将some定义为正常的包方法:

代码语言:javascript
复制
package My2;
use Moose;
extends 'My';
sub some {
    my $self = shift;
    say "   # running 'some'";
    say "   " . __PACKAGE__ . " method 'some' args: " . join " ", @_;
    @_ = reverse @_;
    say "   # running \$self->SUPER::some with no args";
    $self->SUPER::some();
    say "   # running \$self->SUPER::some with reversed args";
    $self->SUPER::some( @_ );
    say "   # running super() with no args";
    super();
    say "   # running super() with reversed args";
    super( @_ );
};

创建一个My2对象,并调用$obj->some('pip','pop')。输出:

代码语言:javascript
复制
# running 'some'
My2 method 'some' args: pip pop
# running $self->SUPER::some with no args
My method 'some' args: 
# running $self->SUPER::some with reversed args
My method 'some' args: pop pip
# running super() with no args
# running super() with reversed args
Arguments passed to super() are ignored at test.pl line 29.

要注意的事情:

  • super()在重新定义的方法中什么也不做;
  • super()不能接受论点;
  • $self->SUPER::some不会自动传递任何参数;
  • $self->SUPER::some的参数可以更改。

现在使用some重新定义override方法

代码语言:javascript
复制
override 'some' => sub {
    my $self = shift;
    say "   # running 'some'";
    say "   " . __PACKAGE__ . " method 'some' args: " . join " ", @_;
    @_ = reverse @_;
    say "   # running \$self->SUPER::some with no args";
    $self->SUPER::some();
    say "   # running \$self->SUPER::some with reversed args";
    $self->SUPER::some( @_ );
    say "   # running super() with no args";
    super();
    say "   # running super() with reversed args";
    super( @_ );
};

输出:

代码语言:javascript
复制
# running 'some'
My2 method 'some' args: pip pop
# running $self->SUPER::some with no args
My method 'some' args: 
# running $self->SUPER::some with reversed args
My method 'some' args: pop pip
# running super() with no args
My method 'some' args: pip pop
# running super() with reversed args
Arguments passed to super() are ignored at test.pl line 29.
My method 'some' args: pip pop

要注意的事情:

  • super()方法现在正确地调用超类方法some
  • super()不能使用参数;它自动使用传递给子类方法的相同@_
  • $self->SUPER::some的参数可以更改。

基本上取决于您如何在子类中实现方法,但这应该说明override和标准方法重新定义之间的区别。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25947199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档