设置MooseX :: Method :: Signatures默认为实例变量

时间:2012-12-05 13:02:55

标签: perl moose

我有一组方法,我希望调用者能够覆盖一个值,或者它默认为实例变量。

所以我一直在努力做的事情是:

method foo( Str :$blah = $self->blah ) {
    #doStuff
}

抛出一个解析错误,所以我到处都是这样做

method foo( Str :$blah? ) {
    $blah = $self->blah unless defined $blah;
    #doStuff
}

不是可怕的,但是当MooseX :: Method :: Signatures支持默认概念并修复了我所有其他标准的“方法开始”行时,这似乎很愚蠢。

当我试图做这样的事情时,我总是找不到网络上遇到同样问题的其他人,我正以错误的方式解决问题。似乎我可能试图将函数程序插入到oo布局中,而不是实际oo,因为这些方法是更多辅助函数,用于外部调用而不是操作对象的方法。所以,只是检查我是否只是错误地定义它,或者我正在做的是“哑”还是Parse :: Method :: Signatures不支持。

1 个答案:

答案 0 :(得分:1)

AFAIK Signatures模块将自身挂钩到Perl解析器中,并注入一些代码来处理原型。值得注意的是,这是有效的。

也就是说,使用非常量值作为默认值可能会有问题。并且可能存在这样的情况:调用某些代码来预填充值可能会造成严重破坏。具体来说,如果没有给出参数的值,或者应该总是调用它,那么只应该调用预填充值的代码吗?我们应该怎样做副作用? caller应该是什么?如果我有一个全局$self对象,那么不应该接收方法调用,因为范围规则明确规定了这个吗? (由于our $x=5; my $x=$x;有效,但只有my $x=$x不是)。更好的是,如果默认值填充方法调用将调用相同的方法,但是再次没有可选参数的值,会发生什么?

您可以随时回到老派可选参数:

sub foo {
  my ($self, $blah) = @_;
  # something like my ($self, $blah) = (@_, $self->blah); wouldn't work, of course.
  $blah //= $self->blah; # nicer than old `unless defined`
  ...;
}

或者,在这种情况下:

method foo (:$blah?) {
   $blah //= $self->blah
}

我觉得使用定义或运算符非常有趣。