【问题标题】:How do I make a new Moose class and instantiate an object of that class at runtime?如何创建一个新的 Moose 类并在运行时实例化该类的对象?
【发布时间】:2011-01-25 18:51:29
【问题描述】:

在使用Moose::Meta::Class->create 创建元类后,如何将该类作为元类实例化一个真正的 Moose 类? (我还需要创建元类,因为我还想为其应用一些角色。)

【问题讨论】:

    标签: perl class runtime moose metaclass


    【解决方案1】:

    当然,元类就是类。如果您想要该类的实例,只需执行以下操作:

    my $instance = $meta->name->new
    

    您可能还需要确保不会过早收集 $meta。通常,您会这样做:

    $meta->add_method( meta => sub { $meta } );
    

    这将保留元类,但如果你不小心,你会泄漏这个类。如果你只做一次,那没关系;如果您这样做数千次,您可能会陷入困境。

    最好使用更高级别的东西,例如Moose::Meta::Class::create_anon_classMooseX::Traits

    【讨论】:

    【解决方案2】:

    不确定这是否回答了此问题或您的其他 SO 问题 How do I build a Moose class at runtime, add a method to it, apply a role to it and instantiate it once? How would you approach this? Building a Moose class at runtime and tuning it,但请查看:

    它可以做你想做的事。或者您可能会发现查看我们的 it 工作很有用。

    文档确实提供了指向我在着手构建此模块时所做的博客文章的链接,因此您可能会发现这些文章也很有帮助。

    这里是 MooseX::SingletonMethod 的简短代码示例:

    {
        package Foo;
        use MooseX::SingletonMethod;
        sub bar { say 'bar' }
    }
    
    my $baz = Foo->new;
    my $bar = Foo->new;
    
    $baz->add_singleton_method( baz => sub { say 'baz' } );
    
    $baz->bar;   # => bar
    $bar->bar;   # => bar
    
    $baz->baz;   # => baz
    $bar->baz;   # Throws can't find baz error
    

    /I3az/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      相关资源
      最近更新 更多