2013-01-10 66 views
3

我定義帶有可選參數的方法可選參數。通常我會用這樣的:默認爲真在Perl

sub foo { 
    ($self, $optarg) = @_; 
    $optarg ||= 1; 
} 

我想可選的參數被視爲布爾值,默認爲true。這顯然不會與上述工作,因爲$optarg將計算爲false如果參數未通過。

有沒有辦法區分缺少一個參數傳遞和值計算爲false?

+0

見[此相關的問題](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)。 –

回答

5

這很好地擴展到多個可選參數:

my $self = shift; 
my $optarg = @_ ? shift : 1; 

所以這樣做,但它處理多個必需參數更好。不幸的是,這違反了可能性最小的原則。

my ($self, $optarg) = @_; 
$optarg = 1 if @_ < 2; 
1
my $optarg; 
$optarg = 1 if not defined $optarg; 

但做筆記@ jordanm的評論,下面

+0

這適用於除'foo(undef)'之外的所有情況,用戶可能期望將其評估爲false。 – jordanm

+2

['我的$ X = ...如果...'是一個不可靠的結構(http://stackoverflow.com/q/14197909/168657)。說'我的$ optarg; $ optarg = 1 if ...'。 – mob

4
my ($self, $optarg) = (@_, 1); 

如果它「不通過」,那麼它不會出現在列表中,你會得到1。否則,假設用戶知道該方法是如何工作的,他們不應該傳入任何可以被視爲第二個參數的錯誤,除非它們將其視爲假值。 (當然,我不是說知識淵博的用戶永遠不會在一個錯誤的值傳遞了一個布爾值。)

+0

我不明白你在說什麼沒有通過虛假作爲第二個參數。 –

+0

我不明白他在那裏說什麼,但代碼似乎工作。 – jordanm

+1

他說如果用戶傳入兩個參數(所以'@ _'有兩個元素),那麼'1'不會被分配。如果'@ _'有一個元素,那麼'1'被分配給'$ optarg'。如果'@ _'沒有元素,調用者就會得到他應得的。 – mob

9

如果你有Perl 5.10版本或更高版本,那麼你可以用$optarg //= 1取代$optarg ||= 1,這將改變$optarg只有當它是undef

或者,如果您想允許undef作爲明確的錯誤值傳遞,則可以說$optarg = 1 if @_ < 2

1

你已經得到了一些很好的迴應,所以我只是要添加一個可能的選項。 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安全的,即使它可能不看它。