gpt4 book ai didi

raku - 编写属性特征

转载 作者:行者123 更新时间:2023-12-04 04:28:33 25 4
gpt4 key购买 nike

我即将为新项目选择使用哪种语言:Perl5 或 Perl6。到目前为止 6 胜,只是它缺少 Moo的惰性属性。我在模块中找到的两个实现缺少关键功能。因此,我尝试编写自己的实现。

角色与类(Class)

我遇到的第一个问题是属性 .package 的内容对于在角色中声明的人。考虑以下内容:

 role HOW1 {
method compose ( Mu $class ) {
note "HOW1.compose";
nextsame;
}
}

role HOW2 {
method compose ( Mu $class ) {
note "HOW2.compose";
nextsame;
}
}

multi trait_mod:<is> (Attribute:D $attr, :$mooish!) {
note "Attribute's package.HOW: ", $attr.package.HOW;
note '$*PACKAGE.HOW: ', $*PACKAGE.HOW;
$attr.package.HOW does HOW1;
$*PACKAGE.HOW does HOW2;
}

class Foo {
has $.bar is mooish;
}

role FooRole {
has $.baz is mooish;
}

脚本的输出如下:
Attribute's package.HOW: Perl6::Metamodel::ClassHOW.new
$*PACKAGE.HOW: Perl6::Metamodel::ClassHOW.new
HOW2.compose
HOW1.compose
Attribute's package.HOW: Perl6::Metamodel::GenericHOW.new
$*PACKAGE.HOW: Perl6::Metamodel::ParametricRoleHOW.new
HOW2.compose

从输出中可以清楚地看出,将角色应用于元类始终适用于类并且仅适用于 $*PACKAGE.HOW与角色。使用 $*PACKAGE而不是 .package可以被认为是一种解决方案,但不是我真正想要使用的解决方案。 (不过,如果没有更好的方法......)

访问器(accessor)

我也想为私有(private)属性提供惰性功能。是的,这将通过 self!bar 提供仅语法,但这是我愿意做出的牺牲。 😉 问题是目前我发现的所有定制访问器的例子都是使用 Attribute.set_value()方法太低级了。我想要这样的东西:
 role MooishHOW {
method compose ( Mu $class ) {
my $accessor = $class.^add_private_method( 'bar1',
method () is rw {
note self.WHO, ".bar1";
Proxy.new(
FETCH => -> $o {
$!bar1;
},
STORE => method ( $val ) {
note "Storing";
$!bar1 = $val;
}
);
}
);

callsame;
}
}

multi trait_mod:<is> (Attribute:D $attr, :$mooish!) {
$attr.package.HOW does MooishHOW unless $attr.package.HOW ~~ MooishHOW;
}

class Foo {
has $.bar is mooish;
has $!bar1 is mooish;

method to-bar1 {
note "bar1 val:",self!bar1;
}
}

my $inst = Foo.new;
$inst.to-bar1;

但是 $!bar1由于范围( MooishRole ),符号无法编译。有没有我遗漏的技巧可以引用 self 上的私有(private)属性? ?

棘手的一个

也许可以将属性设为 Proxy容器?这将大大简化惰性实现的整体逻辑。

最佳答案

我已经回答了我所有的问题,最终实现了目标并发布了AttrX::Mooish模块。

到目前为止,第一个问题的答案是:没有。 $*PACKAGE是目前唯一的办法。

第二个问题:没有答案,但最终代码得靠set_value()反正。

棘手的一个碰巧是可能的:set_value()是否将属性绑定(bind)到容器,从而可以绑定(bind)到 Proxy目的。无需牺牲,可以直接访问私有(private)属性,懒惰地处理它们。

谢谢大家,您的回答让我可以解决一些粗糙的问题!

关于raku - 编写属性特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51618912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com