gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:49:29 25 4
gpt4 key购买 nike

抱歉使用 Java 行话,但是如何重载 Moose 构造函数?

假设我代表一个段。我可以选择起点和点,或者起点和长度,或者终点和长度。

我怎么能允许这样的替代构造方法?

最佳答案

您不需要覆盖 new . 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', isa => 'Num',
predicate => 'has_end', writer => '_set_end',
);

has 'length' => (is => 'ro', isa => 'Num',
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);

关于perl - 如何重载 Moose 构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4003765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com