Esse é um argumento ou nenhum para um bloco Perl 6?
Qual é a maneira do Perl 6 de dizer a diferença entre um argumento e nenhum argumento em um bloco sem assinatura explícita? Não tenho nenhum uso prático para isso, mas estou curioso.
Um bloco sem assinatura explícita coloca o valor em$_
:
my &block := { put "The argument was $_" };
A assinatura é realmente;; $_? is raw
. Esse é um argumento opcional. o@_
A variável não está definida no bloco porque não há assinatura explícita.
Não há argumento, onde$_
será indefinido:
&block(); # no argument
Mas há também uma situação de um argumento em que$_
será indefinido. Um objeto de tipo é sempre indefinido:
&block(Int);
Mas um$_
com nada nele é realmente umQualquer (em vez de, digamos,Nada) Não sei dizer a diferença entre esses dois casos:
&block();
&block(Any);
Aqui está um exemplo mais longo:
my $block := {
say "\t.perl is {$_.perl}";
if $_ ~~ Nil {
put "\tArgument is Nil"
}
elsif ! .defined and $_.^name eq 'Any' {
put "\tArgument is an Any type object"
}
elsif $_ ~~ Any {
put "\tArgument is {$_.^name} type object"
}
else {
put "\tArgument is $_";
}
};
put "No argument: "; $block();
put "Empty argument: "; $block(Empty);
put "Nil argument: "; $block(Nil);
put "Any argument: "; $block(Any);
put "Int argument: "; $block(Int);
Observe o argumento no e as formas Any argument mostram as mesmas coisas:
No argument:
.perl is Any
Argument is an Any type object
Empty argument:
.perl is Empty
Argument is Slip type object
Nil argument:
.perl is Nil
Argument is Nil
Any argument:
.perl is Any
Argument is an Any type object
Int argument:
.perl is Int
Argument is Int type object