Co to jest Perl 6 sposób odróżnić argument i brak argumentów w bloku bez wyraźnego podpisu? Nie mam na to żadnego praktycznego zastosowania, ale jestem ciekawy.Czy jest to jeden argument, czy nie ma go w przypadku bloku Perl 6?
Blok bez wyraźnego podpisu umieszcza wartość w $_
:
my &block := { put "The argument was $_" };
Podpis jest rzeczywiście ;; $_? is raw
. To jeden opcjonalny argument. Zmienna @_
nie jest zdefiniowana w bloku, ponieważ nie ma wyraźnego podpisu.
Tam jest żaden argument, gdzie $_
zostanie zdefiniowana:
&block(); # no argument
Ale jest również sytuacja, w której jeden argument $_
będą niezdefiniowane. Obiekt typu zawsze jest niezdefiniowany:
&block(Int);
Ale $_
nic w nim jest faktycznie Any (raczej niż, powiedzmy, Nil). Nie można odróżnić tych dwóch przypadkach:
&block();
&block(Any);
Oto już przykład:
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);
Zawiadomienie żaden argument i wszelkie formy argumentów pokazują te same rzeczy:
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
Wiem o tym wszystkim. Pytam o sprawę, w której umieściłem słowo "Any". –
@briandfoy Jeśli potrzebujesz tych informacji, nie używaj funkcji, która ma na celu sprawienie, by różnica była niewidoczna. –
To nie jest tak, że tego potrzebuję. Patrzę, jak działa język i jego granice, dzięki czemu mogę powiedzieć innym, czego nie będą w stanie zrobić. –