是的,还在继续有了这个 https://stackoverflow.com/questions/70729700/enforcing-single-instances-from-the-metamodel。我的印象是,Raku 有这个强大的功能,但使用起来并不容易,而且相关文档很少。我想减轻这种情况。
在这种情况下,我试图强制属性默认为只读,以创建不可变的类。这是我的尝试:
my class MetamodelX::Frozen is Metamodel::ClassHOW {
method compose_attributes($the-obj, :$compiler_services) {
my $attribute-container = callsame;
my $new-container = Perl6::Metamodel::AttributeContainer.new(
:attributes($attribute-container.attributes),
:attribute_lookup($attribute-container.attribute_table),
:0attr_rw_by_default
);
$new-container.compose_attributes($the-obj, $compiler_services);
}
}
my package EXPORTHOW {
package DECLARE {
constant frozen = MetamodelX::Frozen;
}
}
我从一个如下所示的主函数中调用它:
use Frozen;
frozen Foo {
has $.bar;
method gist() {
return "→ $!bar";
}
}
my $foo = Foo.new(:3bar);
say $foo.bar;
$foo.bar(33);
我试图追随源头 https://github.com/rakudo/rakudo/blob/10c3dbb940290c67af33dfc617b2f8ce6a21df28/src/Perl6/Metamodel/AttributeContainer.nqp,这并没有真正提供很多工具来更改属性内容,因此似乎没有其他方法可以创建容器的新实例。这可能会以不可预测的方式失败,这就是它的作用:
Type check failed in binding to parameter '$the-obj'; expected Any but got Foo (Foo)
at /home/jmerelo/Code/raku/my-raku-examples/frozen.raku:7
不清楚这是否是第一个the-obj
或第二个,但无论如何,我们感谢一些帮助。
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)