【发布时间】:2013-10-01 19:45:48
【问题描述】:
我刚开始学习 Moose,并且创建了一个非常基础的课程。这是我的代码:
Person.pm
package Person;
use Moose;
has fname => (
is => 'rw',
isa => 'Str',
reader => 'getFirstName',
);
has lname => (
is => 'rw',
isa => 'Str',
reader => 'getLastName',
writer => 'setLastName',
);
sub printName {
my $self = shift;
print $self->getFirstName() . " " . $self->getLastName(), "\n";
}
no Moose;
__PACKAGE__->meta->make_immutable;
person.pl
#!/usr/bin/env perl
use strict;
use warnings;
use Person;
my $person = Person->new(fname => 'jef', lname => 'blah',);
print $person->fname, $person->lname, "\n";
$person->setLastName('bleh');
$person->getName();
这段代码死在第 8 行。它会打印出名字属性,但它会抱怨 lname Can't locate object method "lname" via package "Person" at ./person.pl line 8. 现在,如果我在 lname 中取出 writer,一切都很好,但这有什么意义呢?我意识到我可以使用我创建的 getter,但我很好奇为什么作家会拒绝我访问属性本身?我想我不明白一些东西......
【问题讨论】:
-
我冒昧地猜测一下,一旦定义了读取器和写入器,就不必直接访问该属性,因此拒绝访问;你应该可以写
print $person->fname, $person->getLastName(), "\n"; -
这有点令人困惑……文档中有吗?
-
@incutonez: search.cpan.org/dist/Moose/lib/Moose/Manual/…
-
@Axeman:啊,好的。感谢您指出了这一点。如果您包括在没有自定义 getter/setter 的情况下访问我的属性的正确方法(请参阅我对您的答案的评论),然后在此文档中提示我何时设置了自定义 getter/setter,那么我会接受您的回答。