来自新手用户的第一篇文章。我用google询问的每个问题似乎都把我带到这里,而且我总是对自己要找的东西有很好的回答;因此,当我开始思考在Perl中使用祝福时,这自然是我的第一站。

我刚进入Perl的OOP,今天才读到这篇帖子,问祝福有什么用。我现在知道,它引用标量/哈希/数组到对象,如果可以的话,可以“附加”它。

在我在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/

10-14 21:31
查看更多