如何动态地向类添加属性?我尝试了此方法,但是它提示缺少方法,因此我不确定为什么,因为我没有尝试添加方法。
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;
最佳答案
组成属性后,即在解析其结束的}
curl 之后,就无法将其添加到类中。通常,使用元模型完成的声明式操作需要在编译时完成。
关于您在问题中编写的代码:
Metamodel::AttributeContainer
角色也无济于事。它应组成一个元类,该元类保存有关属性的元数据,而不是具有要声明的属性的类。 bar
的错误是因为属性访问器-甚至是生成的访问器-只是一个普通方法。 首先,不知道要解决的问题就很难知道该建议些什么。无论是什么,都无法通过尝试为每个对象添加属性来解决。也许考虑:
FALLBACK
方法将方法调用解析为对有效键关于metaprogramming - 如何动态添加类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57993203/