我正在研究 Moo 并遇到了这个基本问题。如果我为只读属性设置访问器或写入器名称,则该属性将变为可写。访问者或编写者是否暗示该属性是可写的,即使它被设置为只读(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') 仅在我使用自动生成的访问器名称时才有效,在本例中为“姓氏”。
这是预期的行为还是错误?
非常感谢。