Perl:在Moose类中添加writer会拒绝属性访问

时间:2013-09-26 01:57:39

标签: perl moose perl5.10

我刚刚开始学习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,但我很好奇为什么作者会拒绝我访问属性本身?我想我不明白......

1 个答案:

答案 0 :(得分:2)

lname “属性本身”,因为fname也不是“属性本身”。它也是一个返回属性的函数。通过编写读者和作者,你选择你更喜欢这些名字,这就是全部。

使用错误的名称调用sub 之前。当输入错误的属性名称时,旧的Perl OO方式的祝福哈希值和成员字段作为哈希键导致生存的运行时错误。为访问者制作sub的想法是尽早完成失败。由于哈希可以存储任何字符串,因此受祝福的对象只能调用某组函数,这些函数可以为类定义,也可以继承。

根据the Manual

  

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

     

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

     

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

     

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