3

我在类方法调用中使用命名参数,想知道是否有最佳实践来确保没有传递未知参数。这就是我正在做的

sub classmethod {
    my $self = shift;
    my %args = (
        "param1" => "default1",
        "param2" => "default2",
        @_
    )

    if (my @invalid = grep { !/^(param1|param2)$/ } keys %args) {
        croak "received unknown arg(s) ".join(",", @invalid)." from ".caller();
    }
}

这是前进的正确方法,还是会导致性能问题?

最好的,马库斯

4

2 回答 2

5

您可以使用Params::Validate。另一个选项是Params::Check

如果参数是固定的,那么最好在开发过程中验证它们,并可以选择在运行时关闭验证。

于 2013-10-22T10:08:48.160 回答
1

在 Perl 中有很多方法可以传递参数,也有很多方法可以验证(或不验证)它们。

如果您无论如何都在使用显式默认习惯用法并且想要轻松一点,那么您可以检查哈希中的键数是否等于默认值中的键数。获取键的数量是一种快速操作,它不依赖于哈希表的大小或内容。如果有一个键“in”@_不在%default,那么%args会有更多的键。

与您当前的解决方案相比,它的缺点是它不会告诉您哪个键是意外的。

sub classmethod {
    my $self = shift;
    my %args = (
        param1 => "default1",
        param2 => "default2",
        @_
    );
    keys %args == 2 or croak "received unknown arg. args: " . join(", ", keys %args);
}

或者做这样的事情以避免在更改参数数量时必须更改数字。

sub classmethod {
    my $self = shift;
    my %default = (
        param1 => "default1",
        param2 => "default2",
    );
    my %args = (%default, @_);

    keys %args == keys %default or croak 'unknown arg' . join(", ", keys %args);
}
于 2016-12-28T07:06:17.883 回答