2

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

例如

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;
}

谢谢!

4

2 回答 2

7

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

然而,在 CPAN 的无限领域中,有一个模块MooseX::MultiMethods可以让你做你想做的事——但你必须在你的方法前面加上multi关键字。

例如

multi method makeDeposit() { ... }
multi method makeDeposit(Int $amount) { ... }
于 2013-04-12T19:20:09.720 回答
4

您可以通过检查长度来检查传递了多少个参数@_

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 和帐户。

于 2013-04-12T19:57:24.480 回答