Я изучаю Му и столкнулся с этим основным вопросом.
Если я задаю имя доступа или имя записывающего лица для атрибута только для чтения, атрибут становится доступным для записи. Предполагает ли аксессор или писатель, что атрибут доступен для записи, даже если он установлен только для чтения (is => 'ro')?
Вот код класса:
#!/home/fl/perl5/perlbrew/perls/perl-5.26.1/bin/perl
package MooPerson;
use Moo;
use namespace::clean;
has firstname => (
is => 'rw',
reader => 'get_firstname',
writer => 'set_firstname',
);
has surname => (
is => 'ro',
reader => 'get_surname',
writer => 'set_surname',
);
sub get_fullname {
my ($self) = @_;
my $firstname = $self->get_firstname;
my $surname = $self->get_surname;
return "$firstname $surname";
}
1;
Код объекта:
#!/home/fl/perl5/perlbrew/perls/perl-5.26.1/bin/perl
use lib 'lib';
use MooPerson;
use feature 'say';
use strict;
use warnings;
say "new object person";
my $person = MooPerson->new(
firstname => 'Homer',
surname => 'Simpson',
);
say "person->get_firstname: " . $person->get_firstname();
say "person->get_surname: " . $person->get_surname();
say "\nchange firstname and surname";
$person->set_firstname('Aristotle');
$person->set_surname('Amadopolis');
say "person->get_firstname: " . $person->get_firstname();
say "person->get_surname: " . $person->get_surname();
Результат:
fl@dancertest:~/perltest$ ./firstMoo.pl
new object person
person->get_firstname: Homer
person->get_surname: Simpson
change firstname and surname
person->get_firstname: Aristotle
person->get_surname: Amadopolis
То же самое происходит при использовании средства доступа.
(is => 'ro') работает только если я использую автоматически сгенерированное имя доступа, в данном случае "фамилия".
Это предполагаемое поведение или ошибка?
Большое спасибо.