我可以在Moose中重载方法吗?

时间:2013-04-12 19:11:29

标签: perl moose

我正在寻找类似于Java的解决方案,我可以创建具有相同名称但具有不同参数列表的方法。

e.g。

method makeDeposit() {
    system("cls");
    print "How much money do you want to deposit?: ";
    chomp (my $amount = <STDIN>);
    $self->insufficientFunds(0);
    $self->balance($self->balance() + $amount);
    $self->performBalanceInquiry();
    return;
}

method makeDeposit(Int $amount) {
    $self->insufficientFunds(0);
    $self->balance($self->balance() + $amount);
    $self->performBalanceInquiry();
    return;
}

谢谢!

2 个答案:

答案 0 :(得分:7)

Perl是一种相当松散的类型语言,方法签名中的(伪)类型名称只是动态输入验证代码的简写。

然而,在CPAN的无限之地,有一个模块MooseX::MultiMethods,它可以让你做你想做的事情 - 但你必须在方法前加上multi关键字。

E.g。

multi method makeDeposit() { ... }
multi method makeDeposit(Int $amount) { ... }

答案 1 :(得分:4)

您可以通过检查@_

的长度来检查传递了多少个args
sub makeDeposit {
    my $amount;
    if (@_) {
       ($amount) = @_;
    } else {
        system("cls");
        print "How much money do you want to deposit?: ";
        chomp($amount = <STDIN>);
    }

    $self->insufficientFunds(0);
    $self->balance($self->balance() + $amount);
    $self->performBalanceInquiry();
}

通常情况下,检查参数是否已定义更为简单。

sub makeDeposit {
    my ($amount) = @_;
    if (!defined($amount)) {
        system("cls");
        print "How much money do you want to deposit?: ";
        chomp($amount = <STDIN>);
    }

    $self->insufficientFunds(0);
    $self->balance($self->balance() + $amount);
    $self->performBalanceInquiry();
}

请注意,您的示例显示了不适当的关注点划分。不同的模块应该处理IO和帐户。