Perl:在 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,但我很好奇为什么作家会拒绝我访问属性本身? 我想我不明白什么...

lname不是

"属性本身"fname因为它也不是"属性本身"。它也是一个返回属性的函数。通过写一个读者和作家,你正在选择你喜欢这些子的名字,仅此而已。

用错误的名字调用 sub 会更早失败。旧的 Perl OO 祝福哈希方式和成员字段作为哈希键会导致在属性名称键入错误时幸存的运行时错误。为访问器制作订阅背后的想法是尽早彻底失败。由于哈希可以存储任何字符串,因此祝福对象只能调用一组特定的函数,无论是为类定义的还是继承的。

根据手册,

每个属性都有一个或多个访问器方法。访问器允许您读取和写入对象的该属性的值。

默认情况下,访问器方法与属性同名。如果您将属性声明为 ro,那么您的访问器将是只读的。如果将其声明为 rw,则会获得读写访问器。简单。

鉴于上面的 Person 示例,我们现在有一个 first_name 访问器,它可以读取或写入 Person 对象的 first_name 属性的值。

如果需要,还可以显式指定用于读取和写入属性值的方法名称。当您希望属性可公开读取,但只能私下设置时,这尤其方便。[斜体我的]

最新更新