【问题标题】:perl6 placeholder variable and topic variableperl6 占位符变量和主题变量
【发布时间】:2019-05-06 09:42:12
【问题描述】:

Perl 6 中既有占位符变量,也有主题变量,例如下面两个语句是一样的

say ( $_ * 2 for 3, 9 );        # use topic variables                 
say ( { $^i * 2 } for 3, 9 );   # use placeholder variables

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

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

【问题讨论】:

    标签: raku


    【解决方案1】:

    主题可以有方法调用:

    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;
    }
    

    当对同一个变量有很多操作时,打字会少很多。

    【讨论】:

    • 除此之外还有什么?
    • 我确定有!我还添加了一个given 示例。
    • @JohnZ.Li 当您有多个需要使用的数组/散列元素时也要考虑:什么更具可读性? @^i[0] + @^i[1] - @^i[2] * @^i[3],与 .[0] + .[1] - .[2] * .[3] 相比(正如 drclaw 指出的那样,您可以对主题变量使用方法,而 .[ ] 只是一种方法调用
    • Regex 匹配 m//// 并且替换 s/// 也默认作用于主题 $_
    • when 关键字默认也作用于$_ 变量。
    【解决方案2】:

    有几个主题变量,每个 sigil 一个:$、@、%_ 甚至 &_(是的,例程是 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 是 divisible 的缩写,divd 是 split 的缩写(如果你愿意,你应该使用它)。

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

    【讨论】:

      猜你喜欢
      • 2019-03-16
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      • 2012-05-11
      相关资源
      最近更新 更多