加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 如何重载Moose构造函数?

发布时间:2020-12-15 21:49:18 所属栏目:大数据 来源:网络整理
导读:对不起 Java术语,但我如何重载Moose构造函数? 假设我代表一个细分市场.我可以采取起点和点,或起点和长度,或终点和长度. 我怎样才能允许这种替代施工方法? 解决方法 您不需要覆盖新的. You can supply your own BUILD : #!/usr/bin/perlpackage My::Segmen
对不起 Java术语,但我如何重载Moose构造函数?

假设我代表一个细分市场.我可以采取起点和点,或起点和长度,或终点和长度.

我怎样才能允许这种替代施工方法?

解决方法

您不需要覆盖新的. You can supply your own BUILD
#!/usr/bin/perl

package My::Segment;

use Moose;
use namespace::autoclean;
use Carp qw( confess );

has 'start' => (is => 'ro',isa => 'Num',predicate => 'has_start',writer => '_set_start',);

has 'end' => (is => 'ro',predicate => 'has_end',writer => '_set_end',);

has 'length' => (is => 'ro',predicate => 'has_length',writer => '_set_length',);

sub BUILD {
    my $self = shift;

    $self->has_start and $self->has_end and $self->length and do {
        return if $self->length == $self->end - $self->start;
        confess "Inconsistent start,end and length";
    };

    $self->has_start and $self->has_end and do {
        $self->_set_length($self->end - $self->start);
        return;
    };
    $self->has_start and $self->has_length and do {
        $self->_set_end($self->start + $self->length);
        return;
    };
    $self->has_end and $self->has_length and do {
        $self->_set_start($self->end - $self->length);
        return;
    };
    confess "At least two of start,end or length must be supplied";
}

__PACKAGE__->meta->make_immutable;

package main;
use YAML;

my $x = My::Segment->new(start => 0,length => 3);
my $y = My::Segment->new(start => 1,end => 4);
my $z = My::Segment->new(end => 5,length => 3);

print Dump($_) for $x,$y,$z;

my $w = My::Segment->new(start => 0,end => 0,length => 1);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读