什么是Perl 6中在没有明确签名的块中区分参数和无参数的方法?我没有任何实际用途,但我很好奇。
没有明确签名的块将值放入
签名实际上是
有无参数的情况,其中
请注意,无参形式和任意参数形式显示相同的内容:
没有明确签名的块将值放入
$_
中:my &block := { put "The argument was $_" };
签名实际上是
;; $_? is raw
。这是一个可选参数。在块中,@_
变量未定义,因为没有明确的签名。有无参数的情况,其中
$_
将未定义:&block(); # no argument
但是,只有一个参数的情况下$_
将是未定义的。类型对象始终是未定义的:
&block(Int);
然而,一个没有内容的$_
实际上是一个Any(而不是Nil)。我无法区分这两种情况:
&block();
&block(Any);
以下是一个较长的例子:
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);
请注意,无参形式和任意参数形式显示相同的内容:
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
$_
中设置值,那么它就存在了。而且@_
中的值是不可变的。 - brian d foy@_
,那么“它在那里,如果你不想在$_
中赋值的话。”(我认为Brian的意思是,如果你在一个没有显式签名的块中引用@_
,那么该值不会在$_
中。)然后就把它放在那里。例如{ $_ := .[0] if @_ }
。是的,这很麻烦。但Liz的答案精确地回答了Brian在他的问题中所问的Perl 6的方式(“在没有显式签名的块中区分参数和无参数的方法是什么?”)。Brian指出,这意味着你必须手动绑定或分配$_
,与他接受的答案中的巨大复杂性相比,这只是一个微小的问题。 - raiph@_
中的值是不可变的,只有它所绑定的对象是不可变的。同样的规则也适用于$_
。因此,{ $_++ }(42)
的结果是caller postfix:<++> ... require[s] mutable argument
。如果你想要可变性,只需在我之前的评论中将:=
替换为=
即可。 - raiph