Perl 6中同时存在占位符变量和主题变量。例如,以下两个语句相同
say ( $_ * 2 for 3, 9 ); # use topic variables
say ( { $^i * 2 } for 3, 9 ); # use placeholder variables
Run Code Online (Sandbox Code Playgroud)
在我看来,从主题变量中获得的唯一好处就是节省了一些键盘笔触。
我的问题是:是否存在用例,其中主题变量比占位符变量方便得多?
drc*_*law 11
该主题可以具有方法调用:
say ( .rand for 3,9);
Run Code Online (Sandbox Code Playgroud)
与占位符相比:
say ( {$^i.rand} for 3,9);
Run Code Online (Sandbox Code Playgroud)
节省输入变量名和该块的花括号的时间。
同样,主题变量是given我理解的主要内容:
my @anArrayWithALongName=[1,2,3];
@anArrayWithALongName[1].say;
@anArrayWithALongName[1].sqrt;
#OR
given @anArrayWithALongName[1] {
.say;
.sqrt;
}
Run Code Online (Sandbox Code Playgroud)
当同一变量上有很多操作时,键入的内容就少得多。
jjm*_*elo 11
有几个主题变量,每个变量一个:$ ,@,%_甚至&_(是的,例程在Perl6中是一等公民)。在某种程度上,您还可以使用Whatever(*)并在表达式中创建WhateverCode,从而节省更多的键入内容(看起来,大括号!不要大括号!)。
您可以将数组形式用于几个变量:
my &block = { sum @_ }; say block( 2,3 )
Run Code Online (Sandbox Code Playgroud)
但是它们的主要问题是它们是单个变量,无法反映块调用的复杂性。可以使用占位符变量来重写上面的代码,如下所示:
my &block = { $^a + $^b }; say block( 2,3 )
Run Code Online (Sandbox Code Playgroud)
但是想象一下您手中有一些不可交换的东西。像这儿:
my &block = { @_[1] %% @_[0] }; say block( 3, 9 )
Run Code Online (Sandbox Code Playgroud)
变得笨拙,表达能力不如
my &block = { $^divi %% $^divd }; say block( 3, 9 ); # OUTPUT: «True?»
Run Code Online (Sandbox Code Playgroud)
这里的窍门是,占位符变量按字母顺序分配,divd在divi之前,并且divi表示可整除,而divd表示除法(如果需要,可以使用)。
归根结底,有很多方法可以做到这一点。您可以使用任何您想要的。