perl6占位符变量和主题变量

Joh*_* Li 14 perl6 raku

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)

当同一变量上有很多操作时,键入的内容就少得多。

  • @ JohnZ.Li还考虑了当您需要使用多个数组/哈希元素时:更具可读性的是什么?`@ ^ i [0] + @ ^​​ i [1]-@ ^ i [2] * @ ^ i [3]`与`。[0] +。[1]-。[2] *。[3]`(正如drclaw指出的那样,您可以对主题变量使用方法,而`。[]`只是方法调用的一种 (4认同)
  • 正则表达式匹配`m //`和`//`,并且替换`s ///`也默认作用于主题`$ _`。 (4认同)
  • 默认情况下,when关键字也对$ _变量起作用。 (2认同)

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

归根结底,有很多方法可以做到这一点。您可以使用任何您想要的。