metaprogramming - 如何动态添加类属性?

标签 metaprogramming 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;

最佳答案

组成属性后,即在解析其结束的} curl 之后,就无法将其添加到类中。通常,使用元模型完成的声明式操作需要在编译时完成。

关于您在问题中编写的代码:

  • 从概念上讲,属性是按类而不是按对象存在的,因此无法进行此类工作。
  • 即使将其放在一边,扮演Metamodel::AttributeContainer角色也无济于事。它应组成一个元类,该元类保存有关属性的元数据,而不是具有要声明的属性的类。
  • 找不到方法bar的错误是因为属性访问器-甚至是生成的访问器-只是一个普通方法。

  • 首先,不知道要解决的问题就很难知道该建议些什么。无论是什么,都无法通过尝试为每个对象添加属性来解决。也许考虑:
  • 使用mixins,这是更改单个对象
  • 的一种方法
  • 拥有一个包含用于存储其数据的哈希的类,然后使用FALLBACK方法将方法调用解析为对有效键
  • 的哈希访问

    关于metaprogramming - 如何动态添加类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57993203/

    相关文章:

    MacOS:如何在带有 Raku 的英特尔 mac 上避免 SSL hell ?

    oop - 如果正则表达式是方法,它们对应于哪个类?

    ruby-on-rails-3.2 - 如何从其 "string name"访问实例变量?

    ruby-on-rails - 如何在 Ruby 中动态创建具有给定方法和方法体的类?

    c++ - 显式实例化失败的原因是什么?

    raku - 如何在 Perl 6 中将 sub 放入正则表达式中?

    c++ - 获取静态类函数的类类型

    ruby - 在 ruby​​ 中使用我们自己的自定义方法在 ruby​​ 中创建对象

    regex - 如何规范地解析模块名称

    raku - 如何从函数传递指向容器的指针?