7

引数以外の値に基づいて multi を選択できますが、少なくとも 1 つの引数が必要なのでwhere、そこに を入れることができます。

our $*DEBUG = 1;
debug( 'This should print', 'Phrase 2' );

$*DEBUG = 0;
debug( 'This should not print' );

multi debug ( *@a where ? $*DEBUG ) { put @a }
multi debug ( *@a where ! $*DEBUG ) { True }

誰かがパラメータをまったくとらないマルチ間でディスパッチするために使用したトリックを思い出したようです。たとえば、show-env散らばりたいルーチンがあり、デバッグ条件を設定した場合にのみ何もしません。私が示したようにそれを達成することはできましたが、それはあまり満足のいくものではなく、他の場所で見たと私が想像する賢いものではありません:

our $*DEBUG = 1;
debug( 'This should print', 'Phrase 2' );
show-env();

$*DEBUG = 0;
debug( 'This should not print' );
show-env();

multi debug ( *@a where ? $*DEBUG ) { put @a }
multi debug ( *@a where ! $*DEBUG ) { True }

# use an unnamed capture | but insist it has 0 arguments
multi show-env ( | where { $_.elems == 0 and ? $*DEBUG } ) { dd %*ENV }
multi show-env ( | where { $_.elems == 0 and ! $*DEBUG } ) { True }

オプションの名前付きパラメーターを使用して同様のことを行うこともできますが、それはさらに満足のいくものではありません。

もちろん、この単純な例でこれを行うこともできますが、これは面白くありません。

sub show-env () {
    return True unless $*DEBUG;
    dd %*ENV;
    }
4

2 に答える 2