在perl6中既有占位符变量又有主题变量。例如,以下代码相同
TypeError: e is undefined
在我看来,从主题变量中获得的唯一好处就是节省了一些键盘击键。
我的问题是:是否有一个用例,其中主题变量比占位符更方便?
答案 0 :(得分:11)
该主题可以具有方法调用:
say ( .rand for 3,9);
与占位符相比:
say ( {$^i.rand} for 3,9);
节省键入变量名称和该块的花括号的操作。
根据我的理解,主题变量也是given
块的重点:
my @anArrayWithALongName=[1,2,3];
@anArrayWithALongName[1].say;
@anArrayWithALongName[1].sqrt;
#OR
given @anArrayWithALongName[1] {
.say;
.sqrt;
}
在同一个变量上进行很多操作时,键入的内容会少得多。
答案 1 :(得分:10)
有几个主题变量,每个变量一个:$ ,@ ,%_甚至&_(是的,例程是Perl6中的一等公民)。在某种程度上,您还可以使用Whatever(*)并在表达式中创建WhateverCode,从而节省了更多的键入内容(看起来,马!不用花括号!)。
您可以将数组形式用于多个变量:
my &block = { sum @_ }; say block( 2,3 )
但是它们的主要问题是它们是单个变量,无法反映块调用的复杂性。可以使用以下占位符变量来重写上面的代码:
my &block = { $^a + $^b }; say block( 2,3 )
但是,假设您手中有一些不可交换的东西。就像这里:
my &block = { @_[1] %% @_[0] }; say block( 3, 9 )
变得笨拙,表达力不如
my &block = { $^divi %% $^divd }; say block( 3, 9 ); # OUTPUT: «True»
这里的窍门是,占位符变量按字母顺序分配,divd在divi之前,并且divi表示可整除,而divd表示除法(如果需要,可以使用)。
最终,有很多方法可以做到这一点。您可以使用任何想要的东西。