私は実際に不変の言語がこのようなことをどのように行うかを見に行く必要がありました、そして次のことはおそらく合理的な試みだと思います。
use 5.10.0;
{
package Node;
use Moose;
has [qw(parent child)] => ( isa => 'Node', is => 'ro' );
sub BUILD {
my ( $self, $p ) = @_;
return unless exists $p->{_child};
my $child = Node->new( parent => $self, %{ delete $p->{_child} }, );
$self->meta->get_attribute('child')->set_value( $self, $child );
}
}
say Node->new( _child => {} )->dump
基本的に、オブジェクトを個別に構築しようとする代わりに、引数の受け渡しに基づいて親に子を自動活性化させます。これの出力は、あなたが望んでいた構造であると私は信じています。
$VAR1 = bless( {
'child' => bless( {
'parent' => $VAR1
}, 'Node' )
}, 'Node' );