7

別の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()

そして、あなたが特徴を持っている場合はどうなりますか?それをサポートする透過的な方法はありますか?これらのいずれかが匿名クラスで機能しますか?

4

1 に答える 1

6

あなたの選択の、$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

お役に立てば幸いです。

于 2010-07-16T02:02:22.460 に答える