Вопрос:

Могу ли я выбирать между Perl 6 multis, у которых нет параметров?

perl6 multiple-dispatch

154 просмотра

2 ответа

103798 Репутация автора

Я могу выбрать multi, основываясь на некотором значении без аргументов, но у меня должен быть хотя бы один аргумент, чтобы я мог вводить 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;
    }
Автор: brian d foy Источник Размещён: 01.01.2018 07:49

Ответы (2)


7 плюса

26936 Репутация автора

Решение

Вы могли бы разрушить |с ().

my $*DEBUG = 1;
show-env();

$*DEBUG = 0;
show-env();

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

show-env(42); # Cannot resolve caller show-env(42); …

Или вы могли бы иметь protoдекларацию

proto show-env (){*}
multi show-env ( |      where ? $*DEBUG ) { dd %*ENV }
multi show-env ( |      where ! $*DEBUG ) { True }

show-env(42); # Calling show-env(Int) will never work with proto signature () …
Автор: Brad Gilbert Размещён: 01.01.2018 08:09

7 плюса

12299 Репутация автора

Более элегантный способ настаивать на том, что перехват пустой, указав его с пустой подписью:

multi show-env ( | () where ? $*DEBUG ) { dd %*ENV }
multi show-env ( | () where ! $*DEBUG ) { True }
Автор: Jonathan Worthington Размещён: 01.01.2018 08:10
32x32