代码之家  ›  专栏  ›  技术社区  ›  incutonez

Perl:在Moose类中添加编写器会拒绝属性访问

  •  2
  • incutonez  · 技术社区  · 12 年前

    我刚开始学习驼鹿,我已经创建了一个非常基础的课程。这是我的代码:

    个人.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;
    

    个人.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. 现在,如果我把 writer 在lname,一切都很好,但这有什么意义呢?我意识到我可以使用我创建的getter,但我很好奇为什么一个编写器会拒绝我访问属性本身?我想我不明白什么。。。

    1 回复  |  直到 12 年前
        1
  •  2
  •   Community Mohan Dere    5 年前

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

    用错误的名称调用潜艇失败 早期的 。当属性名称键入错误时,旧的PerlOO方法中的祝福散列和成员字段作为散列键会导致可生存的运行时错误。为访问者制作subs的想法是尽早彻底失败。由于散列可以存储任何字符串,因此一个受祝福的对象只能调用为类定义或继承的特定函数集。

    根据 the Manual ,

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

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

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

    如果你愿意,你也可以 显式指定用于读取和写入属性值的方法名 。当您希望属性是公开可读的,但只能私下设置时,这特别方便。[我的斜体字]