Значения по умолчанию для скользящих хэшей и нечетких авто переменных - PullRequest
4 голосов
/ 10 марта 2019

Существует ли метод передачи значения по умолчанию хеша при переходе в дополнительный вызов?

my %hash is default(222)=(a=>0,b=>111);

sub test {say %_.default};   #using automatic parameter

sub test2(%h) {say %h.default};   #explicit position parameter

test |%hash;  #outputs (Any)

test2 %hash   #outputs 222

Значение по умолчанию для входа %hash теряется при переходе в суб test. Возможно ли иметь значение по умолчанию в бланке? Приветствия

1 Ответ

6 голосов
/ 10 марта 2019
my %hash is default(222)=(a=>0,b=>111);
sub test {say %_.default};   #using automatic parameter
test |%hash;  #outputs (Any)

Скольжение по определению означает превращение контейнера в список его элементов. То есть вы передаете не хеш, а его содержимое.

%_ собирает копий переданных именованных аргументов. Это локальный хеш для блока, в котором он не имеет отношения к хешу, используемому для вставки аргументов. По умолчанию используется значение по умолчанию, равное Any, точно так же, как с объявленным хешем my:

my %foo;
say %foo.default; # (Any)

Существует ли метод передачи значения по умолчанию хеша при переходе к дополнительному вызову?

Вы можете сделать это:

my %hash is default(222)=(a=>0,b=>111);
sub test {say %_<hash-default-for-test>} 
test |%hash, :hash-default-for-test(%hash.default);  #outputs 222

Я выбрал строку ключа 'hash-default-for-test', потому что вряд ли этого достаточно, чтобы он использовался в качестве обычного ключа для любого хэша, в котором разумно брать теоретический риск случайного столкновения ключей.

...