如何编写惰性访问器

easy

延迟构建属性的最佳方法是什么?

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章