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
In reply to Assigning to a ArrayRef accessor type by tomred
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |