tomred has asked for the wisdom of the Perl Monks concerning the following question:
Hi Monks,
I am struggling to understand how I can assign to an ArrayRef accessor. I am trying to use Moo and Types::Standard for my class attributes. My efforts always produce a extra ArrayRef that is one level deeper than I need.
As far as I can tell, you have to assign a reference to the attribute once it's marked as a 'Ref' but in doing so I end up with an array reference inside an array reference. Perhaps I want a list type but I don't see one.
#!perl use v5.22; use warnings; use Test::Deep; use Test::More; BEGIN { package MockObj; use Moo; use Types::Standard qw(ArrayRef Str); use namespace::autoclean; has 'files' => ( # `rpw` would be better as, in practice, # this is only used inside the class is => 'rw', isa => ArrayRef[Str], ); 1; }; my $mock = MockObj->new; my @list = ('string one', 'Different string', 'With feeling'); note explain \@list; $mock->files( \@list ); my @strings = $mock->files; note explain \@strings; cmp_deeply(\@strings, bag(@list)); done_testing;
Your enlighenment is much appreciated,# [ # 'string one', # 'Different string', # 'With feeling' # ] # [ # [ # 'string one', # 'Different string', # 'With feeling' # ] # ] not ok 1 # Failed test at t/test-case.t line 31. # Comparing $data as a Bag # Missing: 'Different string', 'With feeling', 'string one' # Extra: 1 reference
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Assigning to an ArrayRef accessor type
by Athanasius (Archbishop) on Sep 21, 2020 at 15:15 UTC | |
by tobyink (Canon) on Sep 21, 2020 at 17:08 UTC | |
by tomred (Acolyte) on Sep 22, 2020 at 10:59 UTC | |
| A reply falls below the community's threshold of quality. You may see it by logging in. |