perl6占位符变量和主题变量

时间:2019-05-06 09:42:13

标签: perl6

在perl6中既有占位符变量又有主题变量。例如,以下代码相同

TypeError: e is undefined

在我看来,从主题变量中获得的唯一好处就是节省了一些键盘击键。

我的问题是:是否有一个用例,其中主题变量比占位符更方便?

2 个答案:

答案 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表示除法(如果需要,可以使用)。

最终,有很多方法可以做到这一点。您可以使用任何想要的东西。