Perl 6 - Blocks

作者: 焉知非鱼 | 来源:发表于2016-09-10 17:31 被阅读19次

    It’s blocks all the way down

    当我在 glot.io 上玩 Perl 6 的时候我知道它们真的很像带有简单程序的 docker:

    dir('/')>>.Str.say;
    

    我想知道递归到目录里面是否还有更好的方法。 IO::Path.dir 会返回一个 IO::Path 对象的 Seq 序列。那就是为什么 >>. 超运算符会有效。它当然不会递归因为没有用来进行递归的子例程, 经过一段时间的冥思苦想我找到了我找了很久的东西。

    在 Perl 6 中带有一个位置参数的 block 块是可调用的(Callable)。那个参数被绑定给主题变量 $_。 那是我们为什么能做:

    for 1,2,3 {.say}
    

    递归到目录中会很容易如果我们把 Str '/' 变成 IO::Path 对象并且检测我们是否得到了一个目录并且使用那个元素调用那个 block 块。那个 block 块需要一个名字, 这个我们可以通过使用 my &block = {Nil} 做到, 或者我们使用编译时变量 &?BLOCK

    for '.' {
        .Str.say when !.IO.d;
        .IO.dir()>>.&?BLOCK.IO.d
    }
    

    .&?BLOCK 形式会把调用看作像方法调用一样, 这意味着 . 号左侧的对象会成为调用的第一个参数, 在调用者所属的地方。

    我相信这是一个相当好的关于怎样使用 &?BLOCK 来避免嵌套循环和短变量的例子。这会在稍后被添加到文档中。

    Zoffix 的友好帮助下, 那个例子被进一步优化了。

    { .d && .dir».&?BLOCK || .put }(".".IO)
    

    相关文章

      网友评论

      • ZHANGMIAO_:感觉你英语不错
        焉知非鱼:@不要皱眉 记笔记,喝靓汤
        ZHANGMIAO_:@焉知非鱼 不错不错呢 加油加油~
        焉知非鱼:@不要皱眉 我开着 「海词词典」、有道翻译、金山词霸, 哈哈哈, 翻译的不怎么通顺, 主要是为了做笔记给以后自己看。 :blush:

      本文标题:Perl 6 - Blocks

      本文链接:https://www.haomeiwen.com/subject/iagyettx.html