【问题标题】:Correct way to instantiate a Moose object from another Moose object?从另一个 Moose 对象实例化 Moose 对象的正确方法?
【发布时间】:2010-07-16 10:02:22
【问题描述】:

从另一个 Moose 对象创建实例的正确方法是什么?在实践中,我已经看到了很多方法:

$obj->meta->name->new()
$obj->new()  ## which has been deprecated and undeprecated
(blessed $obj)->new()
-- and, its bastard variant: (ref $obj)->new()
$obj->meta->new_object()

然后,如果你有traits 怎么办?有没有一种透明的方式来支持它?这些是否适用于anonymous classes

【问题讨论】:

  • 如创建对象的“克隆”,还是同一对象的新实例?
  • 同一对象的新实例。
  • 如果该实例有角色,您要保留它们吗?
  • 是的,保留它们听起来不错。

标签: perl moose


【解决方案1】:

在您的选择中,$obj->meta->name->new()(blessed $obj)->new() 都是最安全的。

实现特征的方式是,您创建一个匿名子类并将角色应用于该子类并将实例重新分配到该子类中。这意味着这些解决方案中的任何一个都可以很好地处理特征。 Perl 缺乏真正的匿名子类(每个包都必须有命名空间),Moose 通过在匿名类的通用命名空间中创建一个名称来解决这个问题。

如果您花一点时间尝试一些示例代码,您就会看到它的实际效果。

  $perl -Moose -E'with q[MooseX::Traits];
  package Role; use Moose::Role;
  package main; say Class->with_traits(q[Role])->new->meta->name'

  MooseX::Traits::__ANON__::SERIAL::1

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多