perl - 祝福还是不祝福,这是我的问题!

标签 perl oop class bless

新手用户的第一篇文章。我在谷歌上搜索的每一个问题似乎都会把我带到这里,而且我总是能得到很好的答案。所以当我开始思考 Perl 中祝福的用法时,很自然这是我的第一站。

我刚刚进入 Perl 的 OOP,今天刚刚阅读了帖子,询问 bless 是做什么的。我现在明白它引用了一个标量/哈希/数组到一个对象,如果你愿意的话,“附加”它。

在我在 Perl 中看到的大多数类示例中,它们似乎没有我在其他语言中看到的属性......

{ package Person;
    my $property = "This is what I'm talking about :)";

    sub new { ... }
    ...
}

所以,我创建了一个带有属性的愚蠢类,看看会发生什么。我立即给该属性值“NIL”,然后“Not Nil!”在构造函数中。使用方法 LIST,我能够打印该属性,并且正如我所料,它打印了“Not Nil!”

我的问题是,如果属性的工作方式与我预期的一样(在正文中声明),那么为什么要使用 bless 呢?当您可以简单地将标量/哈希/数组创建为属性,或者创建您想要的任何引用作为属性时,拥有该引用的额外好处是什么?

我希望我能很好地解释我想问的问题,用 Perl 非常绿色 :)

最佳答案

好吧,这不是您在 Perl 中创建类的方式。

您的 $property变量在包范围内定义。因此,每个类只有一个副本,而不是每个对象都有自己的副本。

可以使用基于散列的对象来实现这样一个类,方法如下:

#!/usr/bin/perl

package Person;

use strict; use warnings;

sub new {
    my $class = shift;
    my $self = {};
    bless $self => $class;

    my ($arg) = @_;
    for my $property ( qw( message ) ) {
        if ( exists $arg->{$property} ) {
            $self->$property($arg->{$property});
        }
    }
    return $self;
}

sub message {
    my $self = shift;
    return $self->{message} unless @_;
    my ($msg) = @_;
    $self->{message} = $msg;
}

package main;

my $person = Person->new({
    message => "This is what I'm talking about :)"
});

print $person->message, "\n";

现在,这很快就会变得乏味。因此,有一些模块可以帮助您处理这个问题,并帮助您以对继承安全的方式定义您的类。

Class::Accessor就是这样一个实用模块。

对于启动时间不是问题的程序,您应该考虑 Moose .使用 Moose,您可以将上述内容编写为:
#!/usr/bin/perl

package Person;

use Moose;

has 'message' => (is => 'rw', isa => 'Str');

__PACKAGE__->meta->make_immutable;
no Moose;

package main;

my $person = Person->new({
    message => "This is what I'm talking about :)"
});

print $person->message, "\n";

您应该阅读 perldoc perltootMoose::Manual::Unsweetened为标准的做事方式。

关于perl - 祝福还是不祝福,这是我的问题!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3454995/

相关文章:

linux - cPanel/WHM面板服务器是用什么语言做的?

oop - MATLAB 中非静态方法的用途是什么?

c++ - 在 C++ 中实现 Set of octets 类

html - 如何防止 p 标签造成间隙(换行)

perl - 颠覆存储库中增量的格式是什么,如果我在预提交钩子(Hook)中更​​改它们,我能把它炸到什么程度?

perl - 使用 www::mechanize 的爬虫

JavaScript 可链接方法困境

c++ - 这是某种指针错误吗?

C# : Mini Application Structural Design (Classes/Interfaces/etc. )

xml - Perl 通过 HTTP 解析 XML 文件并增加几行