Корректный способ инстанцировать Американского лося возражает от другого объекта Американского лося?

Что корректный путь состоит в том, чтобы создать экземпляр из другого объекта Американского лося? На практике я видел сделанные многочисленные пути:

$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()

И, затем что, если у Вас есть черты? Существует ли прозрачный способ поддерживать это? Какой-либо из них работает с анонимными классами?

7
задан Evan Carroll 14 July 2010 в 22:05
поделиться

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

Надеюсь, это поможет.

6
ответ дан 7 December 2019 в 09:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: