我定義帶有可選參數的方法可選參數。通常我會用這樣的:默認爲真在Perl
sub foo {
($self, $optarg) = @_;
$optarg ||= 1;
}
我想可選的參數被視爲布爾值,默認爲true
。這顯然不會與上述工作,因爲$optarg
將計算爲false如果參數未通過。
有沒有辦法區分缺少一個參數傳遞和值計算爲false?
我定義帶有可選參數的方法可選參數。通常我會用這樣的:默認爲真在Perl
sub foo {
($self, $optarg) = @_;
$optarg ||= 1;
}
我想可選的參數被視爲布爾值,默認爲true
。這顯然不會與上述工作,因爲$optarg
將計算爲false如果參數未通過。
有沒有辦法區分缺少一個參數傳遞和值計算爲false?
這很好地擴展到多個可選參數:
my $self = shift;
my $optarg = @_ ? shift : 1;
所以這樣做,但它處理多個必需參數更好。不幸的是,這違反了可能性最小的原則。
my ($self, $optarg) = @_;
$optarg = 1 if @_ < 2;
my ($self, $optarg) = (@_, 1);
如果它「不通過」,那麼它不會出現在列表中,你會得到1
。否則,假設用戶知道該方法是如何工作的,他們不應該傳入任何可以被視爲第二個參數的錯誤,除非它們將其視爲假值。 (當然,我不是說知識淵博的用戶永遠不會在一個錯誤的值傳遞了一個布爾值。)
如果你有Perl 5.10版本或更高版本,那麼你可以用$optarg //= 1
取代$optarg ||= 1
,這將改變$optarg
只有當它是undef
。
或者,如果您想允許undef
作爲明確的錯誤值傳遞,則可以說$optarg = 1 if @_ < 2
。
你已經得到了一些很好的迴應,所以我只是要添加一個可能的選項。 Method::Signatures爲包含默認值的簽名方法提供了一個很好的語法,並以您期望的方式進行處理。
#!/usr/bin/env perl
package MyClass;
use Moo;
use Method::Signatures;
method foo ($optarg = 1) {
print "$optarg\n";
}
package main;
my $obj = MyClass->new;
$obj->foo;
$obj->foo(0);
請注意,我使用Moo,但它不需要M :: S。還需要注意的是武使得strict
,而這劇本是strict
安全的,即使它可能不看它。
見[此相關的問題](http://stackoverflow.com/questions/8124138/how-to-pass-optional-parameters-to-a-perl-function),用於使用原型的方法(其通常應該是避免)。還[相關](http://stackoverflow.com/questions/3543569/default-argument-values-in-subroutines)。可能有用[這裏](http://www.perlmonks.org/?node_id=161091)。 –