我在Perl中使用Moose
包很多,使用MooseX::Params::Validate
来定义接口。这些接口往往相当灵活,允许多个可选参数。不幸的是,这是Perl,因此返回类型将根据可选参数而变化,并且在调用者中定义的大多数情况下传递可选参数是有好处的。从MooseX::Params::Validate
导出的各种方法在此代码库中使用,因此,处理包的各种方式undef
参数我无法通过它无论如何都会优雅。我倾向于使用以下方法,但它在评论中出现了很多,我想问是否有另一种方法来实现这种灵活性。
use strict;
use warnings;
my $bar;
Foo->foo({
foo => 'I, Foo need a VERY flexible interface. ',
$bar ? ( bar => $bar ) : ()
});
$bar = "Very flexible...";
Foo->foo({
foo => 'I, Foo need a VERY flexible interface. ',
$bar ? ( bar => $bar ) : ()
});
package Foo;
use Moose;
use MooseX::Params::Validate;
sub foo {
my $self = shift;
my ( $foo, $bar ) = validated_list(
\@_,
foo => { isa => 'Str' },
bar => { isa => 'Str', optional => 1 },
);
print $foo . $bar . "\n";
}
1;
检查变量defined
状态的三元运算符总是让我想要一个//
类型参数选项,但我无法在任何地方看到支持这种类型的操作。
caller
的答案是首选的,因为我不想(不会)更改各种套餐的界面,但我愿意接受显示处理方法的答案{{1也传递了参数值。
答案 0 :(得分:0)
正如Craig Estey在他的评论中所说,我认为将选项传递给你的函数并且不必关心它们是否未定义是有意义的。相反,在调用MooseX::Params::Validate::validated_list()
之前,将未定义的散列键作为预处理步骤。例如:
use strict;
use warnings;
my $bar;
Foo->foo({
foo => 'I, Foo need a VERY flexible interface. ',
bar => $bar
});
package Foo;
use Moose;
use MooseX::Params::Validate ();
sub foo {
my $self = shift;
my ( $foo, $bar ) = validated_list(
\@_,
foo => { isa => 'Str' },
bar => { isa => 'Str', optional => 1 },
);
$bar //= 'undef'; # Just to avoid printing warning: Use of uninitialized value
print $foo . $bar . "\n";
}
sub validated_list {
for (keys %{ $_[0]->[0] } ) {
delete $_[0]->[0]{$_} if !defined $_[0]->[0]{$_};
}
return MooseX::Params::Validate::validated_list( @_ );
}
1;
答案 1 :(得分:0)
Maybe
类型可能就是您要找的。通常MooseX :: Params :: Validate 不允许对于像Str这样的东西传递undef,强制你使用三元有条件地传递或不传递它。在子例程中,可选变量无论如何都是undef,但是使用Maybe可以使调用者更容易通过他们拥有的变量(可以定义或不定义)。
sub foo {
my $self = shift;
my ( $foo, $bar ) = validated_list(
\@_,
foo => { isa => 'Str' },
bar => { isa => 'Maybe[Str]', optional => 1 }
);
print $foo . $bar . "\n";
}
通过使用Maybe [Str],它现在将接受undef值,你可以处理这个undef你认为适合你的子程序。
Maybe[`a] accepts either `a or undef.
http://search.cpan.org/dist/Moose-2.0604/lib/Moose/Manual/Types.pod