Perl 驼鹿:你如何对每一个输入进行强制射击?

Perl 驼鹿:你如何对每一个输入进行强制射击?,perl,moose,Perl,Moose,我有一个属性,我想对每个输入值进行强制。在0.72之前,这是通过从Str强制执行Str来实现的。当这个特性被删除时,我求助于硬破解Meta::TypeConstraint文件来保持生产代码的工作。自从发布Moose2.0以来 我过去只是在注释出return$\u0]if$self->check($\u0])时做了这个更改 然而,在MooseV2中做出同样的改变是行不通的。我将此功能用于我知道要用正则表达式清理的字段。然而,检查它们是否符合要求没有什么意义,因为(几乎)它们都不符合要求。我使用这种

我有一个属性,我想对每个输入值进行强制。在0.72之前,这是通过从
Str
强制执行
Str
来实现的。当这个特性被删除时,我求助于硬破解
Meta::TypeConstraint
文件来保持生产代码的工作。自从发布
Moose2.0以来

我过去只是在注释出
return$\u0]if$self->check($\u0])时做了这个更改


然而,在MooseV2中做出同样的改变是行不通的。我将此功能用于我知道要用正则表达式清理的字段。然而,检查它们是否符合要求没有什么意义,因为(几乎)它们都不符合要求。我使用这种方法来处理一些简单的事情,比如在字符串上运行正则表达式,或者重新格式化字符串(在现实世界中,它可以表示db可以使用的货币符号)。

我能想到的希望强制在每个输入上触发的唯一原因是,如果您使用强制来产生副作用,在这种情况下,我想请大家看一个由来已久的医生笑话:

病人:医生,我这样做很痛。
医生:那就别那么做


我意识到你可能有很多代码需要修复,但我毫不怀疑你最终会得到更干净的代码。

我能想到的希望对每个输入都进行强制的唯一原因是,如果你使用强制的副作用,在这种情况下,我建议你参考一个由来已久的医生笑话:

病人:医生,我这样做很痛。
医生:那就别那么做


我意识到您可能有很多代码需要修复,但我毫不怀疑您最终会得到更干净的代码。

您不能自己创建访问器吗<代码>具有foo=>(访问器=>'_-foo',句柄=>{foo=>sub{…},},)你不能自己做一个访问者吗<代码>具有foo=>(访问器=>'_-foo',句柄=>{foo=>sub{…},},)你为什么认为
s/foo/bar/
s/foo/bar/if/foo/更干净。这是相当愚蠢的,而且不必要的慢。另外,如果你想在每个属性分配上运行一个副作用,你不就使用一个触发器(或者一个初始值设定项,如果你想改变属性值)吗?除了一个触发器位于一个属性上,我想在类型上运行它。你为什么认为
s/foo/bar/
s/foo/bar/if/foo/更干净。这是相当愚蠢的,而且速度不必要的慢。另外,如果你想在每个属性分配上运行一个副作用,你会不会只使用一个触发器(或者一个初始值设定项,如果你想改变属性值)?除了一个触发器位于一个属性上,我想在类型上运行它。
sub coerce {
    my $self = shift;

    my $coercion = $self->coercion;

    unless ($coercion) {
        require Moose;
        Moose->throw_error("Cannot coerce without a type coercion");
    }

    #return $_[0] if $self->check($_[0]);

    return $coercion->coerce(@_);
}