Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何将依赖于另一个属性的属性约束从触发器提升到类型细化中?_Perl_Oop_Types_Moo_Type Tiny - Fatal编程技术网

Perl 如何将依赖于另一个属性的属性约束从触发器提升到类型细化中?

Perl 如何将依赖于另一个属性的属性约束从触发器提升到类型细化中?,perl,oop,types,moo,type-tiny,Perl,Oop,Types,Moo,Type Tiny,这项工作: use Moops; class Foo :ro { use Types::Common::Numeric qw(PositiveOrZeroInt); has from => required => true, isa => PositiveOrZeroInt; has to => required => true, isa => PositiveOrZeroInt, trigger => method($to) {

这项工作:

use Moops;
class Foo :ro {
    use Types::Common::Numeric qw(PositiveOrZeroInt);
    has from => required => true, isa => PositiveOrZeroInt;
    has to => required => true, isa => PositiveOrZeroInt, trigger => method($to) {
        die 'must be from ≤ to' unless $self->from <= $to
    };
}
Foo->new(from => 0, to => 1); # ok
Foo->new(from => 1, to => 0); # "must be from ≤ to at …"
使用Moops;
类别Foo:ro{
使用类型::Common::Numeric qw(PositiveOrZeroInt);
has from=>required=>true,isa=>PositiveOrZeroInt;
hastto=>required=>true,isa=>PositiveOrZeroInt,trigger=>method($to){
“死”一定是从哪里来的≤ 到“除非$self->from new(from=>0,to=>1);#好
Foo->new(from=>1,to=>0);#“必须是from≤ 到……”
我希望能够以某种方式使约束成为类型的一部分

use Moops;
class Bar :ro {
    use Types::Common::Numeric qw(PositiveOrZeroInt);
    has from => required => true, isa => PositiveOrZeroInt;
    has to => required => true, isa => PositiveOrZeroInt->where(sub {
        $self->from <= $_
    });
}
Bar->new(from => 0, to => 1);
# Global symbol "$self" requires explicit package name
# (did you forget to declare "my $self"?)
使用Moops;
级别栏:ro{
使用类型::Common::Numeric qw(PositiveOrZeroInt);
has from=>required=>true,isa=>PositiveOrZeroInt;
必须=>required=>true,isa=>PositiveOrZeroInt->where(sub{
$self->from new(from=>0,to=>1);
#全局符号“$self”需要显式的包名
#(你忘了申报“我的$self”?)

我检查了只接收一个参数。

如果要在类型检查中执行此操作,可以将这两个属性合并为一个属性,该属性将是一个包含两个数字的arrayref

使用Moops;
类别Foo:ro{
使用类型:标准qw(元组);
使用类型::Common::Numeric qw(PositiveOrZeroInt);
has from_和_to=>(
必需=>true,
isa=>Tuple->of(PositiveOrZeroInt,PositiveOrZeroInt)->其中(子{
$_->[0] [1];
}),
#提供'from'和'to'方法来获取值
通过=>“数组”处理\u,
句柄=>{
'来自'=>[get=>0],
'到'=>[get=>1],
},
);
#允许“from”和“to”在构造函数中分开
方法BUILDARGS{
我的%args=(@==1?%{$[0]}:@);
$args{from_和_to}| |=[$args{from},$args{to}];
\%args;
}
}
Foo->new(from=>0,to=>1)#好的
Foo->new(from=>1,to=>0);#“必须是from≤ 到……”

不过,我不会在类型检查中这样做。我会在
BUILD
中这样做(不,不是
BUILDARGS
)如果属性是只读的,或者如果属性是读写的,
trigger

在标准Moose中,您应该在
BUILDARGS
中这样做,对吗?您的工作示例依赖于在设置
from
之前设置
to
,因此它可能并不总是工作的。我认为属性是某种单独的实体,无法了解ir friends。根据定义,关于另一件事的约束不能成为该实体的一部分。我认为将该约束放入类型中不是正确的方法。或者至少,我很难理解它。
BUILDARGS
trigger
非常相似,只是它在属性类型检查之前运行,所以我必须e to type会对它们进行两次检查,以防止数值比较运算符在垃圾输入上爆炸,这是很蹩脚的。我可以依赖触发器中已经存在的两个属性,因为此时对象已经完成构造,所以访问器正常工作。您似乎记错了与之相关的顺序re,这是一个属性的唯一情况。