像 *望远镜
这样复杂的仪器对温度敏感。把它们包在一些舒适的绝缘体中会有帮助。在 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.