gdo*_*ald 9 metaprogramming perl6 raku
如何动态地向类添加属性?我尝试了此操作,但是它抱怨缺少方法,因此我不确定为什么,因为我没有尝试添加方法。
use v6.d;
class Foo does Metamodel::AttributeContainer {
submethod BUILD(:$attr) {
my $a = Attribute.new(:name($attr), :type(Str), :package(Foo));
self.add_attribute(self, $a);
}
}
my Foo $foo = Foo.new(:attr('bar'));
$foo.bar = 'baz'; # No such method 'bar' for invocant of type 'Foo'
say $foo.bar;
Run Code Online (Sandbox Code Playgroud)
Jon*_*ton 12
组成属性后,即在}解析其关闭的卷曲之后,就无法将其添加到类中。通常,使用元模型完成的声明式操作需要在编译时完成。
关于您在问题中编写的代码:
Metamodel::AttributeContainer扮演角色也无济于事。它应组成一个元类,该元类保存有关属性的元数据,而不是具有要声明的属性的类。bar找不到该方法的错误是因为属性访问器-甚至是生成的访问器-只是一个普通方法。首先,如果不知道您要解决的问题,就很难知道该建议些什么。无论是什么,都无法通过尝试为每个对象添加属性来解决。也许考虑:
FALLBACK方法将方法调用解析为对有效键的哈希访问