Wrapping a Scope

楽土

*望远镜 这样复杂的仪器对温度敏感。把它们包在一些舒适的绝缘体中会有帮助。在 Perl 6 中,情况恰恰相反。当我们封装一个 Callable 时,我们需要添加绝缘体来保护在不同作用域中的任何东西。

在 IRC 上,AndroidKitKat 问了一个关于 Array-stringification 格式化的问题。有人建议把另一个 gist-method 打成 Array。他被警告说,在这种情况下,预编译将被禁用。一个包装器可以避免这个问题。对于这两种解决方案来说,干扰其他编码者代码的问题(在怀疑是你年轻了一半)仍然存在。幸运的是,我们可以使用动态变量来利用堆栈魔法来解决这个问题。

Array.^can('gist')[0].wrap(
    sub (\a){ 
        print 'wrapped: '; 
        $*dyn ?? a.join(',') !! nextsame 
    }
);

my @a = [1,2,3];

{
    my $*dyn = True;
    say @a;
}

say @a;

# output:
wrapped: 1,2,3
wrapped: [1 2 3]

动态变量没有真正的作用域。它们生活在堆栈上,它们的赋值在调用树上移动。封装器可以检查该变量是否被定义或得到了一个特定的值,如果需要的话,可以通过调用 nextsame 回到默认行为。.wrap 和动态变量都可以跨模块工作。因此,我们可以使我们的代码行为更加可预测。

这一段本来是想总结一下的。但由于博客不支持动态变量,我最好还是停下来,免得我把事情搞得一团糟。

by gfldex.

comments powered by Disqus