3

オプションの引数を持つメソッドを定義しています。通常、私は次のようなものを使用します:

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

オプションの引数をブール値として扱いたいと思います。デフォルトは ですtrue$optarg引数が渡されない場合は false と評価されるため、これは明らかに上記では機能しません。

引数が渡されていないことと、false と評価される値を区別する方法はありますか?

4

5 に答える 5

10

Perl バージョン 5.10 以降を使用している場合は、 に置き換えることができます$optarg ||= 1。これは、 である場合にのみ$optarg //= 1変更されます。$optargundef

undefまたは、明示的な false 値として渡されることを許可する場合は、 と言うことができます$optarg = 1 if @_ < 2

于 2013-01-11T00:03:13.993 に答える
4
my ( $self, $optarg ) = ( @_, 1 );

「渡されていない」場合はリストに含まれず、1. それ以外の場合、ユーザーがメソッドの動作を知っていると仮定すると、false 値として解釈するつもりがない限り、false として解釈できるものを 2 番目の引数として渡すべきではありません。(もちろん、知識のあるユーザーがブール値に偽の値を渡さないと言っているわけではありません。)

于 2013-01-10T23:55:31.157 に答える
4

これは、複数のオプションの引数にうまくスケーリングされます。

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

これもそうですが、複数の必要な引数をより適切に処理します。残念ながら、これは可能な限り最小限の冗長性の原則に違反しています。

my ($self, $optarg) = @_;
$optarg = 1 if @_ < 2;
于 2013-01-11T00:57:56.703 に答える
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 には必要ないことに注意してください。また、Moo が有効になっていることstrict、およびこのスクリプトがstrict安全であることにも注意してください。

于 2013-01-11T14:47:16.563 に答える
1
my $optarg;
$optarg = 1 if not defined $optarg;

ただし、以下の@jordanmのコメントに注意してください

于 2013-01-10T23:54:12.087 に答える