延迟构建属性的最佳方法是什么?
class I {
has $!cheezeburger;
method cheezeburger {
given $!cheezeburger {
when .so {return $_}
default {
# build $cheezeburger, set attribute to it, return
}
}
}
}
芝士汉堡很多。有什么不那么冗长的方法?
Brad给出的实用的解决方案在许多情况下都可以很好地初始化属性(如果未定义):
class Foo {
has $!cheezeburger;
method cheezeburger {
$!cheezeburger //= do { ... }
}
}
另一种方法是通过does
在第一次调用时混入一个角色来替换访问器方法,使用黑魔法(又名NQP操作)访问私有属性:
class Foo {
has $!cheezeburger;
method cheezeburger {
self does role {
method cheezeburger {
use nqp;
nqp::getattr(self, Foo, '$!cheezeburger');
}
}
$!cheezeburger = do { ... }
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句